2012-05-02 4 views
2

내 질문에 대한 답변 : Is it normal that sqlite.fetchall() is so slow? fetch-all 및 fetch-one sqlite 매우 느려질 수 있습니다.sqlite 쿼리를 실행 한 후 결과를 가져 오는 속도를 높이려면 어떻게해야합니까?

time0 = time.time() 
self.cursor.execute("SELECT spectrum_id, feature_table_id "+ 
       "FROM spectrum AS s "+ 
       "INNER JOIN feature AS f "+ 
       "ON f.msrun_msrun_id = s.msrun_msrun_id "+ 
       "INNER JOIN (SELECT feature_feature_table_id, min(rt) AS rtMin, max(rt) AS rtMax, min(mz) AS mzMin, max(mz) as mzMax "+ 
          "FROM convexhull GROUP BY feature_feature_table_id) AS t "+ 
       "ON t.feature_feature_table_id = f.feature_table_id "+ 
       "WHERE s.msrun_msrun_id = ? "+ 
       "AND s.scan_start_time >= t.rtMin "+ 
       "AND s.scan_start_time <= t.rtMax "+ 
       "AND base_peak_mz >= t.mzMin "+ 
       "AND base_peak_mz <= t.mzMax", spectrumFeature_InputValues) 
print 'query took:',time.time()-time0,'seconds' 

time0 = time.time() 
spectrumAndFeature_ids = self.cursor.fetchall()  
print time.time()-time0,'seconds since to fetchall' 

SELECT 문의 실행이 약 50 초 (허용)한다 : 내가 거기에 언급 한 바와 같이

, 나는 다음과 같은 쿼리를 가지고있다. 그러나 fetchall()은 788 초 걸리며 981 개의 결과 만 가져옵니다.

fetchmany()를 사용하여 Is it normal that sqlite.fetchall() is so slow?을 사용하여 내 질문에 대한 응답으로 제공된 쿼리의 속도를 높이는 방법으로 결과를 가져 오는 속도가 향상되지 않았습니다.

sqlite 쿼리를 실행 한 후 결과를 가져 오는 속도를 어떻게 높일 수 있습니까?


내가 명령 줄에서 그것을 실행하려고 정확하게는 SQL :

sqlite> SELECT spectrum_id, feature_table_id 
    ...> FROM spectrum AS s 
    ...> INNER JOIN feature AS f 
    ...> ON f.msrun_msrun_id = s.msrun_msrun_id 
    ...> INNER JOIN (SELECT feature_feature_table_id, min(rt) AS rtMin, max(rt) AS rtMax, min(mz) AS mzMin, max(mz) as mzMax 
    ...> FROM convexhull GROUP BY feature_feature_table_id) AS t 
    ...> ON t.feature_feature_table_id = f.feature_table_id 
    ...> WHERE s.msrun_msrun_id = 1 
    ...> AND s.scan_start_time >= t.rtMin 
    ...> AND s.scan_start_time <= t.rtMax 
    ...> AND base_peak_mz >= t.mzMin 
    ...> AND base_peak_mz <= t.mzMax; 

갱신 :

그래서 나는 약 45 분 전에 명령 줄에서 쿼리를 실행하기 시작, 여전히 바쁘기 때문에 명령 줄을 사용하면 속도가 매우 느립니다.

+0

클라이언트를 통해 실행할 때 같은 쿼리 시간이 얼마나 걸립니까? –

+0

또한, 어떤 sqlite3 파이썬 모듈을 사용하고 있습니까? 어떤 버전입니까? 모듈에서 사용하는 sqlite3 버전은 무엇입니까? –

+0

sqlite 모듈을 사용하고 있습니다 : 2.6.3 및 sqlite 버전 : 3.7.10. SQLite 관리자를 통해 명령을 실행하려고하지만 그것을 처리 할 수없는 것 같습니다. –

답변

1

this question에서 APSW sqlite module을 사용하면 도움이 될 것 같습니다. 어떤 식 으로든 sqlite 모듈의 피해자가되어 성능이 떨어지는 쿼리를 실행하게 될 수 있습니다.

궁금해서 궁금해서 apsw를 직접 사용해 보았습니다. 너무 복잡하지 않았습니다. 왜 시도하지 그래?

  1. latest version 압축을 풉니에

    를 설치하려면 내가했다.

  2. 설치 패키지에 최신 sqlite 합병을 가져 오십시오.

    python setup.py fetch --sqlite 
    
  3. 빌드하고 설치하십시오.

    sudo python setup.py install 
    
  4. 다른 sqlite 모듈 대신 사용하십시오.

    import apsw 
    <...> 
    conn = apsw.Connection('foo.db')