簡體   English   中英

有沒有一種方法可以優化此sql服務器查詢?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM