記事"SQLite: MQL5 での SQL データベースのネイティブな処理"についてのディスカッション - ページ 9

 

Maxim Kuznetsov #:

SQLiteは1つのスレッド、あるいは1人のライターと多くの読者のために設計されている。多くのライターはそれについてではなく、「ライト」ではない他のベースについてです。

MQLがどうのこうのではなく、本当にどこでもそうなのです。

PostgreSQLが機能するのを私が見たいもう1つの理由です。

 
JRandomTrader #:

それもPostgreSQLが機能するのを見たい理由の一つだ。

それで、何が問題なのですか?DLLを許可して使ってください。

私はPostgreSQLのユーザーではありませんが、MySQL、MonetDB、SQL Relay、mt5からのODBCを使ったことがあります。

必要なときは、自然の恩恵を待つより、自分でやったほうが簡単で早い。

 
Maxim Kuznetsov #:

の場合、クエリー速度は低下し、必要なメモリーは増加する......。

でも大丈夫です :-)

SQLiteは、1つのスレッド、または1人のライターと多数のリーダーのために設計されています。SQLiteは1つのスレッド、または1人の書き手と多くの読み手のために設計されています。多くの書き手はそれについてではなく、"ライト "ではない他のベースについてです。

それはMQLについてではありません。

おそらく、あなたはSQLiteを準備する方法を知らない、そのようなすべての着信ストリームを破壊する単一のTCPサーバーなど、すなわち、その中にボトルネックはありません、このサーバーは、他のすべてのデータベースにある...

SQLiteは、それが適切に準備されている場合、書き込み要求の速度は、Redisよりも高くなり、それ自体を読み取ることについて、あなたはベースのスレッドから読み取るとき、お互いにブロックされず、すべてがあなたのシステムリソースで残りの可能な限り高速に発生しますが、あなたはまた、RAM上のデータベースを展開する機会を与えられている、それは作成するときに、どのように、問題ではありませんし、あなたは、RAM上のディスクを作成し、その上にデータベースを配置し、シンボリックリンクを作成するための特別なソフトウェアを介して行うことができますあなたは、例えば、顧問のために使用する場合は、可能な限り最高の パフォーマンスを提供します。

そして、なぜSQLiteでキャッシュ共有が必要なのか理解されていないかもしれません...それは、エキスパートアドバイザーとスクリプトが最終的に消費する メモリが 少なく なるように、入力出力のためのメモリリソースを節約するために必要であり、その作業のために別のスレッドが割り当てられているだけで、インジケーターのために別のスレッドが割り当てられているわけではありません。

共有キャッシュモードが使用される場合、ベースとの接続は個別のスレッドではなくプロセス全体に対して開かれるため、リソースを節約することができますが、結果として上で説明したようなエラーが発生し、共有キャッシュはベースの作業を遅くします。

一方ではMQLの開発者の決定は、私には理解できますが、他方では、私はプラットフォームで多くの経験を持っており、誰もが同時に200以上のスレッドを実行したケースに会ったことがないので、100チャートの端末の制限で1ので、それぞれに1 Expert Advisorと1スクリプトを添付することができますが、あなたはまた、サービスの数にサービスを実行することができます私は制限はないと思うが、それは少なくとも便利ではありませんし、どのような場合にリソースを集約し、これらのスレッドがデータベースへの独自の接続を開いた場合、比較的その後、メモリの海のドロップです。

有能な開発者は、シングルスレッドとして多通貨のExpert Advisorを作成し、そのようなナンセンスに従事しないため、端末のこのような使用は、少なくとも不便であり、せいぜい意味がありません。

開発者の皆さん、共通キャッシュを削除するか、私が見落としている点を突いてください。

公式ドキュメントから"SQLite Shared-Cache"についての要点を抜粋:

「これはシステムが必要とするメモリとIOの量を大幅に減らすことができます。

これがそのリンク だ。

 

MetaEditorで、 データベースを操作するための これらの ボタン(Runを 除く)はまだ機能していないのですか?


常にロックされています。

 

このクエリは何も返しません:

PRAGMA foreign_keys;

FOREIGN KEY を 含めようとすると失敗します:

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

ドキュメントにはこのような情報があります: 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

なぜなら、SQLITE_OMIT_FOREIGN_KEY またはSQLITE_OMIT_TRIGGER が定義された 状態でコンパイルされたから です)。

sqlite_omit_trigger

このオプションを定義すると、TRIGGER オブジェクトのサポートが省略されます。この場合、CREATE TRIGGER コマンドも DROP TRIGGER コマンドも 使用できず、どちらかを実行しようとすると解析エラーになります。トリガを実装し、このオプションで省略されるコードは外部キー操作の 実装にも使用されるため、このオプションは外部キー制約の 強制も無効にします。

sqlite_omit_foreign_key

このオプションが定義されている場合、外部キー制約 構文は 認識されません。


バージョンに問題はありません:

//---

FOREIGN KEYを 有効にするには?

 
Anatoli Kazharski #:

このクエリーは何も返さない:

FOREIGN KEY を 含めようとすると失敗します:

ドキュメントには以下の情報があります:https://www.sqlite.org/foreignkeys.html#fk_enable


バージョンに問題はありません:

//---

FOREIGN KEYを 有効にするには?

FOREIGN KEYはデフォルトで有効になっていますが、SQLITE_OMIT_FOREIGN_KEYやSQLITE_OMIT_TRIGGERは使用しません。

PRAGMA foreign_keys=ON; は使用しないでください。


パフォーマンスをチェックするには、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)
);

エディタで作業する場合、エラーは発生せず、すべてが正しく動作します。

 
Renat Fatkhullin #:

FOREIGN KEY はデフォルトで有効になっていますが、SQLITE_OMIT_FOREIGN_KEY や SQLITE_OMIT_TRIGGER は使用しません。




パフォーマンスをチェックするには、https://www.sqlite.org/foreignkeys.html の例を参考にしてください。

エディタで作業する場合、エラーは発生せず、すべてが正しく動作します。

回答ありがとうございます!

なぜか期待した結果が得られません:

//---

エラーはどこですか?

これは私も対処したいことです:

取引、自動取引システム、取引戦略のテストに関するフォーラム

SQLite:MQL5でSQLデータベースをネイティブに操作する」の記事に関する議論。

Anatoli Kazharski, 2022.10.05 01:54 AM

MetaEditorで データベースを操作するための これらの ボタン(Executeを 除く)はまだ動作しませんか?


常にブロックされています。

 

上の例を誰かに再現してもらってください。

トラック テーブルの最後の行(ハイライトされている)は追加されるべきではありません。

 

SQLiteStudioで 同じスキーマをテストしたところ、すべて正常に動作しました。

親テーブルに存在しないIDの 行を追加 しようとすると、このような警告が表示されます:


 
ありがとう。