在一個表中,有另一個表中有兩個外鍵。SQL內部聯接問題
第一個表格是文檔而另一個表格是常見的。
我當前的代碼,
SELECT a.* FROM documents AS a INNER JOIN common AS c ON a.docId = c.id INNER JOIN common as cc ON a.statusId = cc.id
什麼是加入了更好的性能的最佳方式?
謝謝。
在一個表中,有另一個表中有兩個外鍵。SQL內部聯接問題
第一個表格是文檔而另一個表格是常見的。
我當前的代碼,
SELECT a.* FROM documents AS a INNER JOIN common AS c ON a.docId = c.id INNER JOIN common as cc ON a.statusId = cc.id
什麼是加入了更好的性能的最佳方式?
謝謝。
爲什麼你加入公共表兩次,甚至不選擇任何列? 如果您使用join用於過濾你可以嘗試做這樣的:
SELECT a.*
FROM documents AS a
WHERE (SELECT COUNT(*) FROM common
WHERE a.docId = id OR a.statusId = id)>0
然後您確保ID,和的docId是statusId索引。
如果你只是忘了添加c和cc表到你的列選擇你很好,只是加快設置索引,如果你還沒有。
我忘記選擇公共表中的列。 它應該是** a。*,c.Name,cc.Name ** – kevin 2011-12-21 07:46:00
選擇字段不使用select *
這可以增加在服務器和客戶端的數據流量性能和設置鍵和索引的表
Select a.fieldone, a.fieldtwo FROM documents AS a
INNER JOIN common AS c ON a.docId = c.id
INNER JOIN common as cc ON a.statusId = cc.id
感謝您的信息。 – kevin 2011-12-21 07:47:46
1) Index the joined fields.
2) Ensure that statistics are upto date, this way SQL wont recalculate plan and will used the cached plan
3) Join from the smaller table to the bigger one, help sql server
choose the best plan
4) Read the Query Analyser Plan, if you see a Hash Join being performed on two large tables then add a covering index to make it choose a nested loop join which is better
5) If a small table is joined to a large table a Hash join is so much
better.
6) Avoid bookmark lookups. See this for more info http://www.sqlservercentral.com/articles/Performance+Tuning/bookmarklookups/1899/
感謝您的信息。什麼是統計數據? 如何閱讀查詢分析器計劃?和什麼是哈希加入? 對不起,我的無知。我不擅長SQL。 – kevin 2011-12-21 08:24:57
統計信息是DB統計信息,由sqlserver用於索引的新鮮度。您可以在查詢:菜單下的sqlserver中看到「實際執行計劃」。本文是關於散列連接的基本解釋http://msdn.microsoft.com/en-us/library/aa178403(v=SQL.80)。aspx,你不必知道它,但它調整查詢時很有用 – lloydom 2011-12-21 08:26:06
再次感謝! – kevin 2011-12-21 08:32:12
總是有使用SQL編寫任何查詢的方法不止一種,爲測試性能測試至少兩個候選查詢可能是一個好主意。影響性能的因素很多,其中最重要的就是您正在使用的SQL產品。
注意到,這兩個連接到common
是semijoins這裏有一個建議的替代:
SELECT *
FROM documents AS a
WHERE EXISTS (
SELECT *
FROM common AS c
WHERE a.docId = c.id
)
AND EXISTS (
SELECT *
FROM common AS cc
WHERE a.statusId = cc.id
);
還有,如果你的查詢產生你想要的結果沒有更好的辦法。注意:使用'select *'不太好。更好地指定你實際需要的字段。 http://stackoverflow.com/questions/3639861/why-is-select-considered-harmful – 2011-12-21 07:26:55
感謝您的信息。 – kevin 2011-12-21 07:47:56