日付範囲クエリが極端に遅くなっていませんか? SQLのパフォーマンスが低下していませんか?
日付範囲のサブクエリをまだご覧になっていない場合は、前回の投稿をご確認ください。
https://jp.community.intersystems.com/post/日付範囲クエリのsqlパフォーマンスを改善する
なぜ、こうも日付クエリに注目しているのでしょうか? それは、日付クエリが重要だからです。 それは報告であり、統計であり、自分の素晴らしい仕事を上司に証明するための数字です(もちろん、あなたが実際にそうしていればの話ですが )。では、前回と同じようなテーブルを見てみましょう。ただし、実際には MAXLEN と MINLEN を次のように適切に定義します。
{
Property DateSubmitted as %Date;
Property Data as %String (MAXLEN=200, MINLEN=100);
Index DateIdx on DateSubmitted;
}
では、先月のすべてのデータを取得したい場合を見てみましょう。 次のようなクエリを書き、「良い仕事」を考えます。
FROM DateQ
WHERE TO_DATE(DateSubmitted, 'MM/DD/YYYY') BETWEEN TO_DATE('07/01/2016','MM/DD/YYYY') AND TO_DATE('07/31/2016','MM/DD/YYYY')
これは非常に合理的なクエリです(また、非常に見やすいです)!ただし、クエリプランを見ると次のことがわかります。
クエリプラン |
相対コスト = 787073 <==== カイルのメモ: 絶対にこの数字は見ないでください!!!!! • Call module B, which populates bitmap temp-file A. |
Module: B |
• Read index map SQLUser.DateQ.DateIdx, looping on DateSubmitted and ID. |
皆さんはこう思っていることでしょう。「DateSubmitted でループ!? 範囲を指定したのに!」 そう、そのとおりです! ただし、フィールドを TO_DATE 関数に入れたため、どのようにデータを整形すべきかは分かりません。 技術的には、意図的に誤った形式(奇妙であっても有効になってしまう)を入力することで、さまざまなデータを取得することができます。 では、どうしますか? そう、TO_DATE を削除するのです! 正しい日付形式を使用している限り、クエリは正しい結果を返し、パフォーマンスが大幅に向上します。
クエリ:
FROM DateQ
WHERE DateSubmitted BETWEEN TO_DATE('07/01/2016','MM/DD/YYYY') AND TO_DATE('07/31/2016','MM/DD/YYYY')
プラン:
クエリプラン |
相対コスト = 487364 <==== ちょっと待ってください!これを見ないようにと言ったはずです!!! • Call module B, which populates bitmap temp-file A. |
Module: B |
• Read index map SQLUser.DateQ.DateIdx, looping on DateSubmitted (with a range condition) and ID. • For each row: - Add ID bit to bitmap temp-file A. |
TO_DATE は日付カラムには適さないということを覚えておいてください。 現在選択しているモードに適した形式を使用してください。
ご質問はありますか? コメントはありますか? 以下にご記入ください!