2016-11-14 6 views
-1
SELECT 
    b.1, b.2, b.3, b.4, a.4, a.3, a.5 
FROM 
    a 
RIGHT JOIN 
    b ON a.id = b.id 

このクエリは7分以上かかっています。SQL Serverの右結合が長すぎます

どちらのテーブルにも100,000レコードがあり、各テーブルからの選択は約12秒で実行されます。実行計画では、テーブルaに約8708および100%のオペレータコストの論理読み取りがあると言います。どちらの表にもIDのCIがあります。

+0

右に参加してください。これを試してみてください: –

+1

あなたのクエリは構文エラーを生成します( 'b'はありません)。また、(おそらく)多くのデータを生成します。なぜあなたはこれをしたいのですか? –

+0

uは同じテーブルを両方とも使用しています。a.id = b.id – Chanukya

答えて

0

ID列のINDEXがテーブルAに存在することを確認します。 Bで選択された各行については、列のAの行が検索されます。その列にインデックスが存在しない場合、これはテーブルスキャン、すなわちその特定のIDを有する行を見つけるために100k行を検索する結果となる。効率的ではありません。


PS - 一般的なアドバイス:他の方法は、(そこにはほとんど常にある)が存在しない場合を除きRIGHT JOINを使用していないクエリを記述、INNERに固執、LEFTOUTERが参加します。

0

欠落しているインデックスを特定するために、このSQLを以下に使用してください。私の推測では少なくとも1つは欠けているということです。

SELECT 
statement AS [database.scheme.table], 
column_id , column_name, column_usage, 
migs.user_seeks, migs.user_scans, 
migs.last_user_seek, migs.avg_total_user_cost, 
migs.avg_user_impact 
FROM sys.dm_db_missing_index_details AS mid 
CROSS APPLY sys.dm_db_missing_index_columns (mid.index_handle) 
INNER JOIN sys.dm_db_missing_index_groups AS mig 
ON mig.index_handle = mid.index_handle 
INNER JOIN sys.dm_db_missing_index_group_stats AS migs 
ON mig.index_group_handle=migs.group_handle 
ORDER BY mig.index_group_handle, mig.index_handle, column_id 
関連する問題