2012-01-10 9 views
0

私は3,000万件を超えるエントリ(喜び!)だったレギュラーでクエリしているSql-Server-2008データベースを持っています。残念ながら、このデータベースはまだR/Dで使用されているため大幅に変更することはできません。SQLクエリが遅く、日付別にテーブルを注文しますか?

このデータベースからクエリを実行すると、それには時間がかかります。これで私は結果を待つのに十分なほどの辛抱強さがなかったことを意味します(2分後にR/D部門のロックを避けるために取り消す必要があります)。短い日付範囲(数ヶ月以上)を使用しても、基本的に結果を得ることは不可能です。私は4つの列からの要件を照会しています。残念ながら、別の表のインナー結合を使用する必要があります(これは問合せの効率の面で非常にコストがかかると言われていますが、避けられません)。この内部結合テーブルのエントリ数は100,000未満です。

私が疑問に思っていたのは、検索しなければならない結果の数を減らすために、デフォルトで日付順に並べ替えることは可能ですか?

これができない場合は、クエリ時間を短縮するためにできることはありますか?解決策を考え出すのに役立つ有益な情報はありますか?

私が使用したクエリのサンプルが含まれている:

SELECT DISTINCT N.TestName 
FROM [DalsaTE].[dbo].[ResultsUut] U 
INNER JOIN [DalsaTE].[dbo].[ResultsNumeric] N 
ON N.ModeDescription = 'Mode 8: Low Gain - Green-Blue' 
AND N.ResultsUutId = U.ResultsUutId 
WHERE U.DeviceName = 'BO-32-3HK60-00-R' 
AND U.StartDateTime > '2011-11-25 01:10:10.001' 
ORDER BY N.TestName 

すべてのヘルプや提案が高く評価されています!

+0

説明プランが必要です。または、少なくともどのフィールドがインデックスに登録されているかをお知らせください。 –

+0

注文しているフィールドには、TestNameを含むインデックスなどがありますか? – msarchet

答えて

2

datetimeはテキストベースのフィールドで、その後インデックスが使用されていないようですね?それらが時折ありません考えられる理由速く行うよう

select distinct N.TestName 
from   [DalsaTE].[dbo].[ResultsUut] U 
inner join  [DalsaTE].[dbo].[ResultsNumeric] N 
    on N.ModeDescription = 'Mode 8: Low Gain - Green-Blue' 
    and N.ResultsUutId = U.ResultsUutId 
where   U.DeviceName = 'BO-32-3HK60-00-R' 
       and U.StartDateTime > cast('2011-11-25 01:10:10.001' as datetime) 
order by  N.TestName 

また、(参加あなたの内側の左外側に参加変更しようとする価値があるだろう:

は、あなたが任意の速度改善を持っているかどうかを確認するために、次の試みることができます私が気づいていない少なくとも1つ)。

+0

日付をキャストすると、クエリのヒットとミスが改善されているようです。これはいい。ありがとう! – ImGreg

+0

@ImGreg Glad私は助けることができました! – Codingo

2

あなたの日付の列に基づいてインデックスを追加できます。これにより、クエリ時間が短縮されます。 alter tableコマンドを使用するか、テーブルデザイナーを使用することができます。

ソートを提供する唯一の目的は、結合ですか?もしそうなら、すぐに試してみると、これを取り除き、どのくらいの違いがあるかを知ることができます。少なくともあなたの注意をどこに集中させるかは分かります。

最後に、SQL Server管理スタジオには、パフォーマンス問題の診断に役立つ実行計画などの便利なツールがいくつかあります。がんばろう!

1

クエリの実行に遅延を引き起こす可能性がある多くの問題があります。

インデックス(プライマリキーを除く)はデータの順序を変更しません。多くの値を指定してプライマリキーに戻すインデックス(電話帳)を作成するだけです。

データや既存のインデックスの種類を見ることなく、それは難しいのですが、非常に少なくとも、以下の昇順インデックスが役立つかもしれません:。。

[DalsaTE] [DBO] [ResultsNumeric] ModeDescriptionとResultsUutIdとテスト名

[DalsaTE]。[DBO]。[ResultsUut] StartDateTimeとDeviceNameのとResultsUutId

上記インデックスがなければ、あなたが与えたサンプルクエリは、実際のテーブルデータに単一のルックアップを実行せずに完了することができます。

+0

助けてくれてありがとう!私はUut Tableにインデックスを追加しましたが、残念ながら、タイムアウトのためにNumeric Tableにインデックスを追加できないようです。どのようにそれを調整するための任意のアイデア? (30millionレコードの索引付けは私が想像する間にかかります)オプションの下では、実行のタイムアウトは無制限のようです。 – ImGreg

関連する問題