[英]is there a way to optimize this sql server query?
我有3張桌子:
表1 :
id | name
1 | joe
2 | peter
3 | sandra
表2 :
id | fkId | date_updated
1 | 1 | 2013-01-31
2 | 1 | 2013-04-01
3 | 2 | 2013-02-04
4 | 2 | 2013-01-02
表3 :
id | fkId | date_updated
1 | 1 | 2013-01-31
2 | 3 | 2013-04-01
3 | 3 | 2013-02-04
4 | 2 | 2013-01-02
我有以下內容:
SELECT *
FROM
table1
LEFT OUTER JOIN
table2 ON table1.id = table2.fkId
LEFT OUTER JOIN
table3 ON table1.id = table3.fkId
GROUP BY
table1.id
HAVING
table2.date_updated = max(table2.date_updated)
AND table3.date_updated = max(table3.date_updated)
我的輸出看起來像這樣:
name | table2 | table3
joe | 2013-04-01 | 2013-01-31
peter | 2013-02-04 | 2013-01-02
sandra| | 2013-04-01
我得到了我需要的數據,但是此查詢花費的時間太長了,是否可以在不修改表索引的情況下對其進行優化?
需要指出的是:
table2和table3不是同一張表。
我需要從table2和table3中獲取“ last_updated”的整個行,而不僅僅是日期。
編輯**
使用WHERE table1.id = id
返回單個記錄時,查詢大約需要3-4秒。
Table1有〜84000個記錄
Table2約有96000個記錄
Table3約有81000個記錄
根據顯示的數據,查詢似乎是:
SELECT table1.name, MAX(table2.date_updated), MAX(table3.date_updated)
FROM table1 LEFT OUTER JOIN
table2
ON table1.id = table2.fkId LEFT OUTER JOIN
table3 ON table1.id = table3.fkId
GROUP BY table1.id
table2(fkid, date_updated)
和table2(fkid, date_updated)
上的索引可能會有所幫助。
實際上,使用此類索引,此版本可能會具有更好的性能:
select table1.name,
(select date_updated from table2 where table1.id = table2.fkid order by date_updated desc limit 1
) as T2,
(select date_updated from table3 where table1.id = table3.fkid order by date_updated desc limit 1
) as T3
from table1
這樣就完全消除了分組,將其替換為相關的子查詢-且相關的子查詢應變成索引小索引掃描。
我知道您提到了沒有修改索引的情況,但是只有在每個“ Table2”和“ Table3”都具有索引的情況下,您要做的工作才會得到更好的優化
(fkId,date_updated)。
如果每個表的“ ID”列上只有一個索引,那么顯然在聯接上沒有任何優化。 您至少需要在Table1的外鍵上使用它。 但是,由於這將是表上的新索引,因此它不會有任何損害,而只會幫助您查詢。 在Table2和Table3上都執行此索引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.