プランガイドが使用されないのはなぜですか?


9

転換点の問題に最近遭遇し、クエリオプティマイザが検索列の非クラスタ化インデックスを単に無視するため、数秒以内に実行を完了するために使用されていた一部のレポートクエリが2分以上かかっています。以下のクエリの例:

select top 100 *
from   [dbo].[t_Call]
where  ID > 0 
  and  throwtime between '3/20/2014 7:00:00 AM' and '3/24/2014 6:59:59 AM'
order by id

ID列は、インデックスクラスタ化されたThrowtime非クラスタ化インデックスを持っています。この場合、クエリプランと非クラスター化インデックスthrowtimeID変更するのではなく、順序付けを使用していることに気付きました。また、古いデータの一部をアーカイブすることも計画しています(現在、20 mln行あります!!)。しかし、アプリケーションでこれらの変更を行うにはしばらく時間がかかります。アプリケーションレベルで変更を加えずに、レポートを適度に高速に実行する方法を見つける必要があります(まあ、それは人生です)。

プランガイドを入力してください。非クラスター化インデックスのクエリヒントを使用して以下のプランガイドを作成しましたが、何らかの理由で、非クラスター化インデックスがまだ使用されていません。何か不足していますか?

EXEC sp_create_plan_guide 
@name = N'[prod2reports_callthrowtime]', 
@stmt = N'select top 100 *
          from   [dbo] . [t_Call]
          where  ID > @0 and @1 < = ThrowTime and ThrowTime < = @2 order by ID',
@type = N'SQL', 
@module_or_batch = N'select top 100 *
                     from   [dbo] . [t_Call]
                     where  ID > @0 and @1 < = ThrowTime and ThrowTime < = @2 order by ID', 
@params = N'@0 int, @1 datetime, @2 datetime', 
@hints = N'OPTION (TABLE HINT( [dbo] . [t_Call],
                   INDEX(IDX_NC_t_call_ThrowtimeProblemCodes)))'
GO

非クラスター化インデックスはどのように見えますか?サーバーがそれを無視しているのは、それが何の役にも立たないと思っているからです。計画に誤りがあるか、インデックスに誤りがあります
Allan S. Hansen

3
余談ですが、次のように変更throwtime between '3/20/2014 7:00:00 AM' and '3/24/2014 6:59:59 AM'してthrowtime >= '20140320 07:00' AND throwtime < '20140324 07:00';ください- このブログ投稿これもご覧ください。
アーロンバートランド

@AaronBertrandありがとうございます。はい、私はその変更も提案しました、そして彼らは次のリリースでそれを作るでしょう。
RKクッパラ2014年

回答:


11

クエリは、空白を含め、完全に一致する必要があります。他の方法で入力するのではなく、キャッシュからクエリを取得し、それから作成することをお勧めします。


0

リンクされた記事をもう一度お読みください

インデックスの使用を強制するプランガイドを作成することは、非効率的なブックマークルックアップを強制するため、ほとんど間違いなく望ましいものではありません。あなたの記事によると、このクエリの最も効率的なパフォーマンスの正しい解決策は、インデックスをカバーする非クラスター化インデックスに変更することです。つまり、テーブルのすべての列をインデックスに追加するか、(できれば)このクエリに必要な列を追加し、選択を変更してそれらの列をプルするだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.