0

結合列の一方にはクラスター化インデックスがあり、もう一方には非クラスター化インデックスがあるクエリを使用しています。クエリに時間がかかっています。これが、異なるタイプのインデックスを使用している理由ですか?

SELECT @NoOfOldBills = COUNT(*)
FROM Billing_Detail D, Meter_Info m, Meter_Reading mr
WHERE D.Meter_Reading_ID = mr.id
     AND m.id = mr.Meter_Info_ID
     AND m.id = @Meter_Info_ID
     AND BillType = 'Meter'

IF (@NoOfOldBills > 0) BEGIN

     SELECT TOP 1 @PReadingDate = Bill_Date
     FROM Billing_Detail D, Meter_Info m, Meter_Reading mr
     WHERE D.Meter_Reading_ID = mr.id
          AND m.id = mr.Meter_Info_ID
          AND m.id = @Meter_Info_ID
          AND billtype = 'Meter'
     ORDER BY Bill_Date DESC

END
4

3 に答える 3

1

詳細とコンテキストがわからないと、アドバイスするのは難しいですが、最も古い請求書の日付を調べようとしているようです。おそらく、これら 2 つのクエリを 1 つに書き直すことができます。これにより、パフォーマンスが大幅に向上します (古い請求書がいくつかあると仮定します)。

このようなものをお勧めします - おそらくパフォーマンスが向上するだけでなく、読みやすくなります!

SELECT count(d.*) NoOfOldBills, MAX(d.Billing_Date) OldestBillingDate FROM Billing_Detail d
  INNER JOIN Meter_Reading mr ON  mr.id=d.Meter_Reading_ID
  INNER JOIN Meter_Info m ON m.Id=mr.Meter_Info_ID
WHERE
  m.id = @Meter_Info_ID AND billtype = 'Meter'
于 2013-06-26T08:22:43.433 に答える
0

その理由は、さまざまな種類のインデックスがあるためではありません。すべての主キーにクラスター化されたインデックスがあると言ったので、問題ないはずです。このクエリをサポートするには、時間を短縮するために BillType と Bill_Date の 2 つの列を持つインデックスも必要です。

うまくいけば、彼らは同じテーブルにいます。そうしないと、最終的に 2 つの列を持つインデックスを作成するためにいくつかのインデックスが必要になる場合があります。

于 2013-06-26T14:23:59.870 に答える
0

OK、ここにはたくさんのことがあります。まず、関連性のある (または可能な限り関連性のある) インデックスです。各テーブルにはクラスター化インデックスが必要です。非クラスター化インデックスが行の識別に使用するクラスター化インデックスがテーブルにない場合、非クラスター化インデックスは効果的に機能しません。

インデックスは 1 列のみをカバーしていますか? SQL Server は、インデックスの列の順序が非常に重要なインデックスを使用します。インデックスの左端の列は、(一般に) 最大の順序性を持つ列である必要があります (データを最小量に分割します) インデックスのいずれかがクエリで参照されるすべての列をカバーしていますか (これはカバーリングとして知られています)インデックス (詳細については、これを Google で検索してください)。

SQL Server が col1、col2、col3、col4 にインデックスを持ち、col1、col2 に別のインデックスを持っている場合、2 番目のインデックスからの情報は最初のインデックスに完全に含まれており、SQL Server はこれを理解するため、後者は冗長です。 .

統計は最新ですか?統計が最新でない場合、SQL Server は不適切な実行計画を選択する可能性があります。クエリ アナライザーはプランの実行に対して何を表示しますか (SSMS クエリ | 実行プランを表示)?

于 2013-06-26T08:13:55.897 に答える