ANALYZEコマンドには欠点がありますか(わずかに大きいdbを除く)?そうでない場合、なぜデフォルトで実行されないのですか?
2 に答える
もう1つの欠点があります。ANALYZEの結果により、クエリプランナーは本当に使用したいインデックスを無視する可能性があります。
たとえば、ブール列が「isSpecial」のテーブルがあるとします。ほとんどの行にはisSpecial=0がありますが、isSpecial=1の行もいくつかあります。
クエリを実行するSELECT * FROM MyTable WHERE isSpecial = 1
と、ANALYZEデータがない場合、クエリプランナーはisSpecialのインデックスが適切であると見なし、それを使用します。この場合、それはたまたま正しいでしょう。isSpecial = 0を実行する場合でも、インデックスが使用されますが、これは非効率的であるため、実行しないでください。
ANALYZEを実行すると、クエリプランナーはisSpecialに値が2つしかないことを認識します。そのため、インデックスの選択性が悪くなります。したがって、上記のisSpecial = 1の場合でも、使用されません。isSpecial値が非常に不均一に分散されていることを知るには、SQLITE_ENABLE_STAT4オプションを使用してコンパイルした場合にのみ収集するデータが必要になります。このオプションはデフォルトでは有効になっておらず、それ自体に大きな欠点があります。準備されたステートメントのクエリプランがバインドされた値に依存するため、sqliteはステートメントをより頻繁に再準備します。(おそらく実行されるたびに、詳細はわかりません)
tl; dr:ANALYZEを実行すると、ブールフィールドが役立つことがわかっている場合でも、ブールフィールドでインデックスを使用することはほとんど不可能になります。
簡単な答え:節約された時間よりも計算に時間がかかる場合があります。
インデックスとは異なり、ANALYZE統計は、データが追加または更新されたときに自動的に最新の状態に保たれません。大量のデータが追加されたり更新されたりした場合は、ANALYZEを再実行する必要があります。