1

전체 테이블을 검색하는 쿼리가 있습니다, 5million 레코드가 있습니다, 그것은 약 60 비용. 이것을 최적화하는 방법? 나는 sqlite의 메모리 모드를 사용하려고 시도했다. 이론적으로 이것은 전체 데이터베이스가 memroy에 저장되기 때문에 더 빠르다. 그러나 비용은 거의 같은 시간입니다. 이 같은 테이블 스키마 :왜 메모리 모드에서 donot 가속 sqlite

CREATE TABLE tbl0(estimateid int, seq int, field1 int NULL, field2 int NULL, field3 int NULL, field4 int NULL); 
CREATE INDEX tbl0_idx on tbl0(estimateid); 
CREATE TABLE tbl1(seq int, companyid int, field1 int NULL, field2 int NULL, field3 int NULL, field4 int NULL, field5 int NULL); 
CREATE INDEX tbl1_idx on tbl1(seq); 
CREATE TABLE tbl2(symbolid int, relatedcompanyid int, value char(64), field1 int NULL, field2 int NULL, field3 int NULL, field4 int NULL, field5 int NULL); 
CREATE INDEX tbl2_idx on tbl2(relatedcompanyid); 

이 쿼리는 쿼리 조인 3 개 테이블이 필요합니다

>explain query plan select tbl0.estimateid, tbl1.seq, tbl1.companyid, tbl2.value from tbl0, tbl1, tbl2 where tbl0.seq = tbl1.seq and tbl1.companyid = tbl2.relatedcompanyid; 
0|0|1|SCAN TABLE tbl1 
0|1|2|SEARCH TABLE tbl2 USING INDEX tbl2_idx (relatedcompanyid=?) 
0|2|0|SEARCH TABLE tbl0 USING AUTOMATIC COVERING INDEX (seq=?) 

방법이 쿼리를 가속화 할 수 있습니까? 하나의 테이블이 완전히 스캔되는 것이 불가피한 것 같습니다. 각 테이블에는 약 5 백만 개의 레코드가 들어 있으며,이 쿼리에는 매우 긴 시간 (몇 분)이 소요됩니다. db를 메모리에 넣었을 때 # sqlite3 : memory :를 사용하면 속도가 달라지지 않습니다. 도움이 매우 감사합니다.

+0

이를 최적화하려면 5 백만 개의 레코드를 검사하지 마십시오. –

답변

1

전체 인덱스 스캔 : 문서에 따라한다 (타입 지수)는 선택된 전체 테이블 스캔 후 2 최악의 실행 계획이다.

전체 테이블 스캔은 DB를위한 리소스 집약적 인 작업이며, 메모리, CPU 속도를 높이고 테이블을 인덱싱하며 레코드 수를 줄이지 않으면 장면 뒤에 마법이 없습니다. 모든 것을 메모리로 옮길 때 급격한 속도 증가를 감지했습니다.

이 문제를 피하고 더 나은 쿼리를 작성하거나 DB 및 테이블 구조를 최적화해야합니다. SQL 실행 및 최적화 방법에 대한 자세한 내용은 EXPLAIN QUERY PLANQuery Planning을 참조하십시오.

이 더 말을하고

+0

위의 조인 쿼리를 가속화하는 방법을 알려주시겠습니까? 하나의 테이블이 완전히 스캔 된 것 같습니다. 어떻게 스캔 할 테이블을 결정할 수 있습니까? 가능하면 tbl2의 레코드를 줄이고 sblite를 검색하여 tbl1과 tbl0을 검색합니다. 이 방법으로 쿼리가 빨라질 것이라고 생각합니다. – wushiqi

+0

@wushiqi, 귀하의 경우, 지금 당장 귀하의 테이블에 대해 적절한 인덱스를 사용하는 것이 좋습니다. 전체 테이블 스캔은 값을 찾기 위해 스캔하기 때문에 전체 데이터를 검색해야합니다. 인덱스는 데이터베이스 검색 엔진이 데이터 검색 속도를 높이기 위해 사용할 수있는 특수 조회 테이블입니다. 요약하면 : 테이블 조인에 사용되는 열은 일반적으로 조회 기준으로 자주 사용되는 열뿐만 아니라 완벽한 후보입니다. – Farside

+0

위와 같이 색인을 생성했습니다. 이것을 최적화하는 방법을 알려주시겠습니까? 이제 각 테이블에는 5 백만 개의 레코드가 포함되어 있으며이 쿼리에는 300 초가 소요되며 총 300,000,000 개의 레코드가 생성됩니다. 나는 매우 갈망의 최적화입니다. 많은 감사합니다 !!! – wushiqi

0

데이터베이스가 메모리에없는 등 데이터, 쿼리의 특성을 DB 구조를 제공하지 않은 원래의 문제로, 구체적 어렵다 ; 넌 뭔가 잘못 했어. 필자는 다른 메모리 내 데이터베이스 시스템에 5 백만 개의 레코드를로드하는 프로그램을 만들었으며 전체 순차 스캔의 경우 800 밀리 초 미만이 걸렸습니다. 비록 SQLite가 내가 사용한 메모리 내장 데이터베이스 시스템의 절반 밖에 안된다고해도, SQLite는 1 ~ 2 초 정도 걸립니다.

또 다른 가능성은 전체 행을 가져 오는 모든 행을 가져 오거나 다른 논리를 수행 한 후 콘솔에 쓰는 것입니다.