2012-02-08 7 views
0

私は1MillionレコードのSqliteデータベースを使用しています。私は複数の列でソートする必要があります。そのため私はorderbyのパフォーマンスを向上させるデータベース上の複合インデックスを作成しましたが、インデックスに指定された並べ替え順序を逆にするとパフォーマンスは悪いです。 私はインデックスを作成しました。 インデックスを作成します。StudentIDNAMEIndex ( SID DESC、 名前DESC );私は、SIDのASC、NAMEのDESCまたは任意の他の組み合わせによって注文時SQLiteでインデックスなしのORDER BYのパフォーマンスを改善

クエリBY ORDERのパフォーマンスが大幅に低下します。各組み合わせにインデックスを追加することはできないため、インデックスなしでソートを改善したり、インデックスを効果的に使用したりする別の方法がありますか?

+2

あなたは非常に多くのレコードを持っている場合は、多分あなたは、Oracle、MySQLの、SQL Server、またはPostgreSQLのような、よりヘビー級のデータベース、を調べる必要がありますか? SQLiteはシンプルできれいに設計されており、バグを導入するのを難しくしています。私が指摘した他のDBMSは、バグの数が少なく、優れた性能を発揮するように設計されています。 –

+0

@AdamMihalcinによるコメントに加えて、より重いデータベースを入手するために支払う必要はなく、多くのものは無料であるか、機能が制限された無料のバージョン(SQL Server Expressなど)を提供するバージョンはまだこのタスクのためにSQLiteよりずっと高速です – Seph

答えて

4

百万個をソートすると、100万個のソートが行われます。必要な順序でソートされていない場合は、データのソートが必要なだけ時間がかかります。データベースが読み取り専用の場合、以下のように、あなたが作品の多くのソートのパフォーマンスの劇的な改善を得ることができると述べた

。各テキスト列を取得し、その列の値(ソート順)、昇順のid、およびidのインデックスのみを持つ表を作成します。元の表では、text列をidに置き換えます。最後には、百万のエントリを持つテーブルを取得します。それぞれのエントリは数値IDのリストです。

(整数、文字列よりも早く、比較、および並べ替えの際に周りスローするように、より少ないデータを持っているので)あなたは、並べ替えにはるかに速く、このテーブルを見つける必要があります。元のテキストデータのすべての補助テーブルに参加することはできます。しかし、補助表にない新しいテキストを入力する必要がある場合は、多くの作業が必要になります。この構造を使用するためのアプリケーションの再構築には多くの労力が必要です。私は過去にこのデザインを使用しました、読み取り専用操作のパフォーマンスの向上が極めて重要であると言いました

。しかし、それを動作させるために必要な作業も重要でした。

関連する問題