0

SQL Server でいくつかのクエリを高速化する必要があります。

助けてくれてありがとう。

1 つ目はライブ DB で約 30 ~ 45 秒かかり、2 つ目は 90 秒かかります。

ご参考までに、私は病院で働いているため、カテゴリ名と非常に大きなデータベースがあります

select Status, StatusChoice, Category, VisitID, 
     OrderedProcedureName, OrderDateTime, ServiceDateTime 
from OeOrders 
where Category IN 'RAD' 
    and StatusChoice = 'S'

.

select Status, StatusChoice, Category, VisitID, 
     OrderedProcedureName, OrderDateTime, ServiceDateTime 
from OeOrders 
where Category IN ('RAD','CT','US','MRI') 
    and StatusChoice = 'S'
4

3 に答える 3

1

テーブルにインデックスを作成することで、SELECT のパフォーマンスを向上させることができます。SQL もインデックスを更新する必要があるため、クエリ以外のコマンド (UPDATE、INSERT、DELETE など) のパフォーマンスが少し悪くなる可能性がありますが、自由に試してみてください。

このスクリプトを 1 回実行してから、遅延を秒単位で再度確認します。

CREATE INDEX iCategoryChoiche ON OeOrders 
(StatusChoice,Category) INCLUDE (Status, StatusChoice, Category, VisitID, OrderedProcedureName, OrderDateTime, ServiceDateTime)
于 2012-11-16T14:26:33.540 に答える
0

FROMにサブクエリを配置することにより、最初にStatusChoiceフィルタリングを適用しようとする場合があります。

select src.*
from (
select Status, StatusChoice, Category, VisitID, 
     OrderedProcedureName, OrderDateTime, ServiceDateTime 
from OeOrders 
where StatusChoice = 'S'
) src
where src.Category IN ('RAD','CT','US','MRI') 

しかし、改善の可能性はかなり小さいです-DBMSはおそらくすでにこの方法でクエリを実行しています。このreweriteの理由は、複数の値を持つ「IN」は、SQLではかなり遅い「or」述語によるフィルタリングに変換されることが多いため、「or'ed」される行の小さなセットがより速く返される可能性があるためです。

クエリは非常に単純なので、実行プランを確認する必要があります。実行プランから、どのインデックスが再編成を使用できるか、およびどの統計を更新する必要があるか(または新しく作成する必要があるか)がわかります。確かに、(StatusChoice、Category)の新しいインデックスは、まだ存在しない場合に役立ちます。

「ダーティ」な結果を気にしない場合は、(NOLOCK)ヒントを使用することもできます。

于 2012-11-16T14:47:55.937 に答える
0

=最初の SQLでは の代わりに使用できると言えますがIN、確かに高速です。

select Status, StatusChoice, Category, VisitID, OrderedProcedureName, OrderDateTime, ServiceDateTime from OeOrders where Category='RAD' and StatusChoice = 'S'

これらも参照して ください。

于 2012-11-16T14:25:46.770 に答える