web-dev-qa-db-ja.com

SQL Serverのサブクエリと内部結合

次のクエリがあります

内部結合を使用する最初のもの

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?

34
Nithesh

通常、結合は内部クエリよりも高速に動作しますが、実際にはSQL Serverによって生成された実行プランに依存します。クエリの作成方法に関係なく、SQL Serverは常に実行プランに基づいてクエリを変換します。両方のクエリから同じプランを生成するのに十分な「スマート」であれば、同じ結果が得られます。

ここ および ここ 役立つリンク。

30
Diego

Sql Server Management Studioでは、「クライアント統計」と「実際の実行計画を含める」を有効にできます。これにより、各リクエストの実行時間と負荷を正確に知ることができます。

また、各リクエスト間でキャッシュを消去して、キャッシュのパフォーマンスへの影響を回避します

USE <YOURDATABASENAME>;
GO
CHECKPOINT;
GO
DBCC DROPCLEANBUFFERS;
GO

理論に頼るよりも、常に自分の目で見るのが最善だと思います!

12
Arno 2501

サブクエリと結合

テーブル1行20行、2列

表2 20行、2列

サブクエリ20 * 20

20 * 2に参加

論理的、修正する

詳細

enter image description here

enter image description here

スキャンカウントは、システムがデータをフェッチするために何度も通過する必要があるため、パフォーマンスの測定のために、時間を見て、乗算効果を示します

5
user4584103

結合はサブクエリよりも高速です。

サブクエリは、ビジーディスクアクセスを作成します。アクセスすると、ハードディスクの読み取り/書き込み針(ヘッド?)が前後に移動します:User、SearchExpression、PageSize、DrilldownPageSize、User、SearchExpression、PageSize、DrilldownPageSize、User ...などに。

結合は、最初の2つのテーブルの結果に操作を集中させることで機能し、その後の結合は、最初に結合されたテーブルのメモリ内(またはディスクにキャッシュされた)結果に集中します。読み取り/書き込み針の動きが少ないため、高速

ソース: ここ

5
Paz

最初のクエリは両方のテーブルを結合しているため、最初のクエリは2番目のクエリよりも優れています。また、両方のクエリの説明計画を確認してください...

1
murali krishna

それはすべて、データとテーブル間のリレーショナルマッピングに依存します。 RDBMSルールに従わない場合、最初のクエリでさえ実行およびデータのフェッチが遅くなります。

0
ammad khan