2016-10-24 4 views
0

SQLiteでは、SELECTを使用して1つのデータベースからデータを読み取り、いくつかの変更を行い、別のデータベースに書き込んでいます。I/Oは読み取りによってバインドされていますか?最適化する方法は?

iotopの出力を見ると、(1つのコアのみを使用する)プロセスのパフォーマンスはI/Oバウンド(IO> 80%、CPU < 20%)です。私がiotopで見ることができる行動の大半は 'DISK READ'の下で行われており、今はたびに 'DISK WRITE'の下に何かが表示されています。

プロセスのパフォーマンスは、SELECT /読み取りトランザクションによって拘束される可能性はありますか?基本的に、私がウェブ上で見るSQLiteのすべてのパフォーマンス関連情報は約INSERT/writeです。データの読み取りについて知り、最適化するための何かがありますか?

索引が欠落しているフィールドでのSELECTによる非効率的な問合せは、CPUよりもIOに強い影響を与えますか?

+0

多くの書き込みがある場合、それらを1つのトランザクションにマージして最適化することができます。読み取りを最適化するのは難しいです... –

+0

この質問はあまりにも幅広いです。特定のクエリをスピードアップしたい場合は、そのクエリについて質問してください。 –

+0

開始する前に、読んでいるデータベースをRAMディスクに置くことを検討してください。 –

答えて

0

質問がかなり広いので、答えも同様です:はい、欠落しているフィールドを選択すると、IOに大きな影響を与えることがあります。

クエリ、スキーマ、およびデータによっては、SQLiteがフルテーブルスキャンを実行している可能性があります。

explain query planを実行すると、特定の状況でSQLiteが何をしているかがわかります。

+0

はい、すべての関連フィールドはインデックスに登録されています。他の方法を最適化するには? –

+0

スキーマとクエリによって異なります。 Explain Query Planは、インデックスが実際に使用されているかどうかを示します。 –

+0

私はそれをしました。 –

関連する問題