2011-12-26 4 views
3

を選択して、私は次のテーブルを持っている:明確な大規模なデータベースのために長い時間を要する

CREATE TABLE notes (noteId INTEGER PRIMARY KEY ASC, note, note_length, count, unique(note) on conflict abort) 

また3万行が含まれています。

私は、次のコマンドを実行します。ただし

def getDistintNoteCountList(note_length): 
    with sqlite3.connect(r'./note_database') as connection: 
     cursor = connection.cursor() 
     cursor.execute('select distinct count from notes where note_length = ?', [note_length]) 
     return [i[0] for i in cursor] 

を、それが返されたリストには、周りの20の大きさを持って実行するには、この機能のために30秒かかり、私は300万を持っていることを考えると、この合理的です私は間違ったことをしていますか?

おかげで、

バリー

EDIT

を追加しました:

cursor.execute("create index countIndex on notes (count)") 
cursor.commit() 

、データベースにデータを再ロード。それはまだまるで遅いようです。

+1

カウントにインデックスを追加しようとしましたか? – dasblinkenlight

答えて

2

問合せには、note_lengthを含むwhere句があり、countフィールドが必要なため、最適な索引の順序は(note_length、count)です。これはカバーインデックスbtwですが、sqliteがこの状況でそれを悪用できるかどうかはわかりません。

sqliteクエリ計画について説明します。in this page

2

解決策は最適化をパスします。

countindexにするとかなり高速になります。

0

DISTINCTが何をするためには、重複を削除できるようにソートを実行する必要があります。基礎となるテーブル/クエリの結果セットのサイズ、および使用可能なインデックスがあれば、これは高価なステップになることがよくあります。

私はSQLliteのエキスパートではありませんが、それは何度も実行されるループ内のネストされたクエリであれば、それはスティングになります。また、SELECT DISTINCT COUNTは完全に正しいですか?確かにCOUNTは1つの値しか返しません。

これらの両方の点はtoshかもしれません。私のテーブルが適切に索引付けされているかどうかは確かです。 DISTINCTがまったく必要かどうか。

+1

'count'はOP内のカラムの名前です(右にスクロールする必要があります)。 – dasblinkenlight

+0

ええ、それを見つけませんでした。完全な関数と同じ名前で列を呼び出すことはまったく良い習慣ではないので、「カウント」ではなくCOUNTであっても私のポイントは有効なままです。さらに、ループされたDISTINCTと索引付けについての点は有効です。 –

1

count列だけでなく、countnote_length列の両方で複雑なインデックスを作成してください。

関連する問題