2016-11-14 156 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分鐘。Right加入SQL Server時間太長

這兩個表都有大約100 000條記錄,每個表中只有一個選項平均運行12秒左右。在執行計劃中,它表示a表的邏輯讀數大約爲8708,操作員成本爲100%。兩個表都具有CI on ID。

+0

Ew一個正確的加入。試試這個: –

+1

你的查詢會產生一個語法錯誤(沒有'b')。它也(可能)生成大量和大量的數據。你爲什麼想做這個? –

+0

你正在使用兩張相同的表格從右側加入a.id = b.id – Chanukya

回答

0

驗證列中的INDEX列存在於表A中。對於在B中選擇的每一行,將在ID列中對A中的行進行查找。如果在該列上不存在索引,則這將導致表掃描,即通過100k行查找以找到具有該特定的行的ID。效率不高。


PS - 一般的建議:寫不使用RIGHT JOIN,堅持INNERLEFTOUTER加入除非有沒有其他的方法(有幾乎總是)查詢。

0

使用下面的這個sql來幫助你識別任何缺失的索引。我的猜測是你至少缺少一個。

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