次のクエリがあります
内部結合を使用する最初のもの
SELECT item_ID,item_Code,item_Name
FROM [Pharmacy].[tblitemHdr] I
INNER JOIN EMR.tblFavourites F ON I.item_ID=F.itemID
WHERE F.doctorID = @doctorId AND F.favType = 'I'
次のようなサブクエリを使用して
SELECT item_ID,item_Code,item_Name from [Pharmacy].[tblitemHdr]
WHERE item_ID IN
(SELECT itemID FROM EMR.tblFavourites
WHERE doctorID = @doctorId AND favType = 'I'
)
このアイテムテーブル[Pharmacy].[tblitemHdr]
15列と2000レコードが含まれています。そして、[Pharmacy].[tblitemHdr]
には5つの列と約100のレコードが含まれます。このシナリオではwhich query gives me better performance?
Sql Server Management Studioでは、「クライアント統計」と「実際の実行計画を含める」を有効にできます。これにより、各リクエストの実行時間と負荷を正確に知ることができます。
また、各リクエスト間でキャッシュを消去して、キャッシュのパフォーマンスへの影響を回避します
USE <YOURDATABASENAME>;
GO
CHECKPOINT;
GO
DBCC DROPCLEANBUFFERS;
GO
理論に頼るよりも、常に自分の目で見るのが最善だと思います!
結合はサブクエリよりも高速です。
サブクエリは、ビジーディスクアクセスを作成します。アクセスすると、ハードディスクの読み取り/書き込み針(ヘッド?)が前後に移動します:User、SearchExpression、PageSize、DrilldownPageSize、User、SearchExpression、PageSize、DrilldownPageSize、User ...などに。
結合は、最初の2つのテーブルの結果に操作を集中させることで機能し、その後の結合は、最初に結合されたテーブルのメモリ内(またはディスクにキャッシュされた)結果に集中します。読み取り/書き込み針の動きが少ないため、高速
ソース: ここ
最初のクエリは両方のテーブルを結合しているため、最初のクエリは2番目のクエリよりも優れています。また、両方のクエリの説明計画を確認してください...
それはすべて、データとテーブル間のリレーショナルマッピングに依存します。 RDBMSルールに従わない場合、最初のクエリでさえ実行およびデータのフェッチが遅くなります。