2011-12-19 89 views
0

我有3個表a,b,c。需要提高sql查詢的性能

select * from a 

select * from b where aid in (select id from a) 

select * from c where bid in (select Id from b where aid in (select id from a)) 

這些查詢在sp和工作正常,但作爲性能我需要優化這些。 您能否建議我如何提高性能,或者任何可用於 優化sql查詢的工具。

謝謝。

+1

「正常工作」 - 爲什麼你認爲你有性能問題? – 2011-12-19 08:53:52

+0

工作正常意味着給予適當的結果,但在第三個查詢我傳遞兩個子查詢。在那種情況下id的b然後這將執行,所以花時間是有任何替代方式。 – Areeb 2011-12-19 08:58:30

+0

我會假設sql server 2008有一個足夠好的優化器,可以用Tudor Constantin建議的內部連接來實現你可笑的低效sql代碼。所以,我更願意打賭,通過按照Anders UP的建議指定合適的索引,您會看到性能提升。無論如何,請告訴我們您嘗試了這些建議後發生了什麼。 – 2011-12-19 09:59:32

回答

0

你可以表達你的查詢,如:

select * from b where b.aid = a.id and a.somefield = 'value' 
3

我想你可以使用INNER JOIN重寫查詢:

select * from c 
INNER JOIN b ON b.id = c.bid 
INNER JOIN a ON a.id = b.aid 

,如果您有編號,投標指標和援助都應該罰款

2

可能有很多原因,爲什麼你的查詢很慢。從你描述的幾個出發點可能是:

  • 索引缺失或不正確。至少你必須在你加入或過濾的列上有索引。
  • 索引統計信息必須是最新的
  • 索引在某些情況下可以從包含更多字段的列中受益。
  • 返回的數據量正確 - 無論是在列和行方面。如果你返回太多,你會淹沒各種緩衝區並降低整體性能。

您可能想要使用Tuning Advisor和/或SQL Server Profiler--在啓動時SQL Server文件夾下的Performance Tools菜單中都可用。

此外,學習Management Studios報告的可能性以及熟悉執行計劃是很好的起點。

對於更高級的學習者,開始包括查詢I/O(管理工作室查詢窗口)的統計信息,使用Windows性能監視器來關注相關的SQL Server計數器等等。對其中一些的一個很好的解釋可以在這裏找到:http://www.sql-server-performance.com/2005/sql-server-performance-monitor-coutners/

0

你也可以嘗試使用存在,而不是IN:s。如果有配發的數據,可以幫助:*相關

SELECT 
    * 
FROM 
    a 

SELECT 
    * 
FROM 
    b 
WHERE EXISTS 
    (
     SELECT 
      NULL 
     FROM 
      a 
     WHERE 
      a.id=b.aid 
    ) 

SELECT 
    * 
FROM 
    c 
WHERE EXISTS 
    (
     SELECT 
      NULL 
     FROM 
      b 
     WHERE 
      c.bid=b.Id 
      AND EXISTS 
      (
       SELECT 
        NULL 
       FROM 
        a 
       WHERE 
        b.aid=a.id 
      ) 
    ) 
0
  1. 避免使用。明確提到列名稱。
  2. 將非聚簇索引用於具有大量記錄的表。
  3. 使用聯接而不是子查詢。
  4. 在存儲過程中使用「上設置NoCount」。
  5. 您可以使用臨時表。插入所需的數據並最終執行。不要忘記在退出存儲過程之前先刪除它。