기고글 토론 "SQLite: MQL5로 SQL 데이터베이스의 처리" - 페이지 9

 

Maxim Kuznetsov #:

SQLite는 하나의 스레드 또는 한 명의 작성자와 많은 독자를 위해 설계되었습니다. 많은 작성자는 그것에 관한 것이 아니라 "가볍지 않은" 다른 기반에 관한 것입니다.

MQL에 관한 것이 아니라 모든 곳에서 실제로 사용되는 방식입니다.

이것이 바로 제가 PostgreSQL을 보고 싶은 또 다른 이유입니다.

 
JRandomTrader #:

이것이 바로 제가 PostgreSQL이 작동하는 것을 보고 싶은 또 다른 이유입니다.

그럼 해보세요, 뭐가 문제인가요? DLL을 허용하고 사용하세요.

저는 PostgreSQL 사용자는 아니지만 mt5에서 MySQL, MonetDB, SQL Relay 및 ODBC를 사용했습니다.

필요가있을 때 자연의 호의를 기다리는 것보다 직접하는 것이 더 쉽고 빠릅니다.

 
Maxim Kuznetsov #:

쿼리 속도가 떨어지고 메모리 요구 사항이 증가합니다....

하지만 모든 것이 괜찮습니다 :-)

SQLite는 하나의 스레드 또는 하나의 작성자와 많은 독자를 위해 설계되었습니다. 많은 작가는 그것에 대해 "가볍지"않은 다른 기반에 대해 이야기하지 않습니다.

그것은 MQL에 관한 것이 아니라 실제로 그리고 모든 곳에서있는 방식입니다.

아마도 SQLite를 준비하는 방법을 모를 수도 있고, 들어오는 모든 스트림을 파괴하는 단일 TCP 서버와 같은 병목 현상이 없으며,이 서버는 다른 모든 데이터베이스에 있습니다 ...

SQLite는 선물이며, 제대로 준비되면 쓰기 요청의 속도가 Redis보다 높으며 읽기 자체에 대해서는 기본 스레드에서 읽을 때 서로를 차단하지 않고 시스템 리소스에서 가능한 한 빨리 모든 일이 발생하면 RAM에 데이터베이스를 배포 할 수있는 기회가 주어지며, 생성 할 때 어떻게 생성 할 때, 특수 소프트웨어를 통해 RAM에 디스크를 만들고 데이터베이스를 배치하고 예를 들어 조언자를 위해 사용하는 경우 기호 링크를 만들 수 있으므로 최상의 성능을 제공 할 수있는 특수 소프트웨어를 사용할 수 있습니다.

그리고 아마도 SQLite에서 캐시 공유가 필요한 이유를 이해하지 못할 수도 있습니다..., 입력 출력을위한 메모리 리소스를 절약해야하므로 결국 전문가 고문과 스크립트가 메모리를 소비하고 작업을 위해 별도의 스레드가 할당되기 때문에 지표에 대해 별도의 스레드가 할당되지 않습니다.

공유 캐시 모드를 사용하면 별도의 스레드가 아닌 전체 프로세스에 대해베이스와의 연결이 열리므로 리소스가 절약되지만 결과적으로 위에서 설명한 것과 유사한 오류가 발생하고 공유 캐시로 인해베이스의 작업 속도가 느려집니다.

한편으로는 MQL 개발자의 결정은 저에게는 이해할 수 있지만 다른 한편으로는 플랫폼에 대한 많은 경험이 있고 누군가가 200 개 이상의 스레드를 동시에 실행 한 사례를 만난 적이 없기 때문에 100 개 차트의 터미널 제한에서 1 개에서 1 개의 전문가 고문과 스크립트를 각각 첨부 할 수 있지만 서비스 수에 제한이 없다고 생각하지만 적어도 어떤 경우에도 편리하고 자원 집약적이지 않으며 이러한 스레드가 데이터베이스에 자체 연결을 열면 상대적으로 메모리 바다의 방울이 될 수 있으므로별로 많지 않습니다.

이러한 터미널의 사용은 유능한 개발자가 다중 통화 전문가 고문을 단일 스레드로 만들고 그러한 말도 안되는 일에 관여하지 않기 때문에 적어도 불편하고 기껏해야 말이되지 않습니다.

개발자 여러분, 공통 캐시를 제거하거나 제가 놓친 부분을 찌르세요.

공식 문서에서"SQLite 공유 캐시"에 대한 요점을 가져왔습니다:

"이는 시스템에 필요한 메모리와 IO의 양을 크게 줄일 수 있습니다."

여기 링크가 있으니 읽어보세요.

 

메타에디터에서 데이터베이스 작업을 위한 이러한 버튼( 실행 제외)이 작동하지 않나요?


항상 잠겨 있습니다.

 

이 쿼리는 아무것도 반환하지 않습니다:

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_외래 키

이 옵션이 정의되어 있으면외래 키 제약 조건 구문이 인식되지 않습니다.


버전에는 문제가 없습니다:

//---

외래 키를 활성화하는 방법은 무엇인가요?

 
Anatoli Kazharski #:

이 쿼리는 아무것도 반환하지 않습니다:

FOREIGN KEY를 포함하려고 시도했지만 실패했습니다:

문서에 다음 정보가 있습니다: https: //www.sqlite.org/foreignkeys.html#fk_enable


버전에는 문제가 없습니다:

//---

외래 키를 활성화하는 방법은 무엇인가요?

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는 사용하지 않습니다.

PRAGMA foreign_keys=ON; 을 사용하면 안 됩니다.


성능을 확인하려면 https://www.sqlite.org/foreignkeys.html 예제를 참조하세요.

편집기에서 작업할 때 모든 것이 오류 없이 올바르게 작동합니다.

답변 주셔서 감사합니다!

어떤 이유로 내가 기대하는 결과를 얻지 못하고 있습니다:

//---

오류는 어디에 있습니까?

그리고 이것은 나도 다루고 싶은 것입니다:

트레이딩, 자동 트레이딩 시스템 및 테스트 트레이딩 전략에 관한 포럼

"SQLite: MQL5에서 SQL 데이터베이스로 네이티브 작업" 문서에 대한 토론.

아나톨리 카즈하르스키, 2022.10.05 01:54 AM

메타에디터에서 데이터베이스 작업을 위한 버튼( 실행 제외)이 아직 작동하지 않나요?


항상 차단되어 있습니다.

 

다른 사람에게 위의 예시를 재현해 달라고 요청하세요.

트랙 테이블의 마지막 행(강조 표시됨)을 추가해서는 안 됩니다.

 

SQLiteStudio에서 동일한 스키마를 테스트한 결과 모든 것이 올바르게 작동합니다.

상위 테이블에 존재하지 않는 ID를 가진 행을 추가하려고 할 때 경고가 표시되는 모습은 다음과 같습니다:


 
감사합니다, 확인해 보겠습니다.