Discussão do artigo "SQLite: trabalho nativo com bancos de dados SQL em MQL5" - página 9

 

Maxim Kuznetsov #:

O SQLite foi projetado para uma thread ou um escritor e muitos leitores. Muitos escritores não se referem a ele, mas a outras bases que não são "leves".

Não se trata de MQL - é assim que as coisas são na realidade e em toda parte.

E esse é outro motivo pelo qual eu gostaria de ver o PostgreSQL funcionando.

 
JRandomTrader #:

E esse é outro motivo pelo qual eu gostaria de ver o PostgreSQL funcionando.

Então faça isso, qual é o problema? Permita a DLL e use-a.

Não sou usuário do PostgreSQL, mas já usei MySQL, MonetDB, SQL Relay e ODBC do mt5.

Quando há necessidade, é mais fácil e rápido fazer você mesmo do que esperar por favores da natureza

 
Maxim Kuznetsov #:

a velocidade da consulta cairá e os requisitos de memória aumentarão....

mas está tudo bem :-)

O SQLite foi projetado para uma thread ou um escritor e muitos leitores. Muitos escritores não se preocupam com isso, mas com outras bases que não são "leves".

Não se trata de MQL - é assim que as coisas são na realidade e em toda parte.

Talvez você não saiba como preparar o SQLite, não há gargalos nele, ou seja, como um único servidor TCP, que destrói todos os fluxos de entrada, esse servidor está em todos os outros bancos de dados ...

O SQLite é um presente, se for preparado adequadamente, a velocidade das solicitações de gravação será maior que a do Redis, e sobre a leitura em si, enquanto quando você lê a partir dos threads de base não bloqueia um ao outro e tudo acontece o mais rápido possível, descansando nos recursos do seu sistema, você também tem a oportunidade de implantar o banco de dados na RAM, não importa como, ao criar, e você pode, por meio de um software especial, criar um disco na RAM e nele colocar o banco de dados e criar um link simbólico, se você usar, por exemplo, para consultores, o que fornecerá o melhor desempenho possível.

E talvez você não entenda por que o compartilhamento de cache é necessário no SQLite..., ele é necessário para economizar recursos de memória para entrada e saída, de modo que os Expert Advisors e os scripts consumam menos memória no final, e somente porque um thread separado é alocado para o trabalho deles, um thread separado não é alocado para os indicadores.

Quando o modo de cache compartilhado é usado, a conexão com a base é aberta para todo o processo, e não para threads separadas, o que economiza recursos, mas, como consequência, leva a erros semelhantes aos que descrevi acima e o cache compartilhado torna o trabalho da base mais lento.

A decisão dos desenvolvedores de MQL, por um lado, é compreensível para mim, mas, por outro lado, não muito, pois tenho muita experiência com a plataforma e não encontrei casos em que alguém executou mais de 200 threads simultaneamente, em 1 no limite do terminal de 100 gráficos, para que você possa anexar 1 Expert Advisor e 1 script a cada um, mas você também pode executar serviços no número de serviços, acho que não há limite, mas pelo menos não é conveniente e consome muitos recursos em qualquer caso, e se esses threads abriram suas próprias conexões com o banco de dados é uma gota no oceano de memória relativamente então.

Esse uso do terminal é, no mínimo, inconveniente e, no máximo, não faz sentido, porque um desenvolvedor competente criará um Expert Advisor em várias moedas como um único thread e não se envolverá em tal absurdo.

Prezados desenvolvedores, por favor, removam o cache comum ou me indiquem o que deixei passar.

Extraí a essência do"SQLite Shared-Cache" da documentação oficial:

"Isso pode reduzir significativamente a quantidade de memória e IO exigida pelo sistema."

Aqui está o link, leia-o.

 

No MetaEditor, esses botões (exceto Run) para trabalhar com o banco de dados ainda não funcionam?


Eles estão sempre bloqueados.

 

Essa consulta não retorna nada:

PRAGMA foreign_keys;

A tentativa de incluir uma FOREIGN KEY falha:

    string query = "PRAGMA foreign_keys=ON;";
    if(!DatabaseExecute(m_db_handle, query)) {
      Print(__FUNCTION__, " > Query failed with code: ", GetLastError());
    }

A documentação tem esta informação: https: //www.sqlite.org/foreignkeys.html#fk_enable

Tip: If the command "PRAGMA foreign_keys" returns no data instead of a single row containing "0" or "1", then the version of SQLite you are using does not support foreign keys (either because it is older than 3.6.19 or

porque foi compilado com SQLITE_OMIT_FOREIGN_KEY ou SQLITE_OMIT_TRIGGER definido).

SQLITE_OMIT_TRIGGER

A definição dessa opção omite o suporte a objetos TRIGGER. Os comandos CREATE TRIGGER ou DROP TRIGGER não estão disponíveis nesse caso, e a tentativa de executar qualquer um deles resultará em um erro de análise. Essa opção também desativa a aplicação derestrições de chave estrangeira, pois o código que implementa os acionadores e que é omitido por essa opção também é usado para implementarações de chave estrangeira.

SQLITE_OMIT_FOREIGN_KEY

Se essa opção for definida, a sintaxe da restrição de chave estrangeira não será reconhecida.


Não há nada de errado com a versão:

//---

Como ativar a FOREIGN KEY?

 
Anatoli Kazharski #:

Essa consulta não retorna nada:

A tentativa de incluir uma FOREIGN KEY falha:

A documentação tem esta informação: https: //www.sqlite.org/foreignkeys.html#fk_enable


Não há nada de errado com a versão:

//---

Como ativar a FOREIGN KEY?

FOREIGN KEY é habilitada por padrão, não usamos SQLITE_OMIT_FOREIGN_KEY ou SQLITE_OMIT_TRIGGER.

PRAGMA foreign_keys=ON; não deve ser usado.


.

Para verificar o desempenho, você pode usar o exemplo https://www.sqlite.org/foreignkeys.html.

CREATE TABLE artist(
  artistid    INTEGER PRIMARY KEY, 
  artistname  TEXT
);

CREATE TABLE track(
  trackid     INTEGER, 
  trackname   TEXT, 
  trackartist INTEGER,
  FOREIGN KEY(trackartist) REFERENCES artist(artistid)
);

Ao trabalhar no editor, tudo funciona corretamente, sem erros.

 
Renat Fatkhullin #:

FOREIGN KEY é ativado por padrão, não usamos SQLITE_OMIT_FOREIGN_KEY ou SQLITE_OMIT_TRIGGER.

PRAGMA foreign_keys=ON; não deve ser usado.


Para verificar o desempenho, você pode usar o exemplo https://www.sqlite.org/foreignkeys.html.

Ao trabalhar no editor, tudo funciona corretamente, sem erros.

Obrigado pela resposta!

Por algum motivo, não estou obtendo o resultado esperado:

//---

Onde está o erro?

E é com isso que eu gostaria de lidar também:

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Discussão do artigo "SQLite: trabalho nativo com bancos de dados SQL em MQL5".

Anatoli Kazharski, 2022.10.05 01:54 AM

No MetaEditor, esses botões (exceto Execute) para trabalhar com o banco de dados ainda não funcionam?


Eles estão sempre bloqueados.

 

Peça a alguém para reproduzir o exemplo acima.

A última linha da tabela de trilhas (destacada) não deve ser adicionada.

 

Testei o mesmo esquema no SQLiteStudio e tudo funciona corretamente.

Esta é a aparência do aviso ao tentar adicionar uma linha com um ID que não existe na tabela pai:


 
Obrigado, vamos dar uma olhada.