2013-09-25 74 views
0

我使用SQL Server 2008和我的SQL查詢看起來是這樣的:如何讓sql運行更快?

select * from (
select row_number() over(PARTITION by tb01.P_USER order by tb04.P_data7 desc) Row 
    ,tb01.P_USER as 'enterpriseID' 
    ,tb01.P_ID as 'greenhouseID' 
    ,tb01.P_NAME as 'greenhouseName' 
    ,tb04.P_data1 as 'airTemp' 
    ,tb04.P_data2 as 'airHi' 
    ,tb04.P_data3 as 'soilTemp' 
    ,tb04.P_data4 as 'soilHi' 
    ,tb04.P_data5 as 'co' 
    ,tb04.P_data6 as 'sun' 
    ,tb04.P_data7 as 'pickingTime' 
    ,tb05.P_data5 as 'params' 
from TB04 tb04,TB01 tb01,TB05 tb05,TB12 tb12 
where tb04.P_data8 = tb05.P_data2 
and tb05.P_data1=tb01.P_ID 
and tb01.P_USER = tb12.P_data1 
and tb12.CodeId = '410621' 
) result where Row between (3-1)*20+1 and 3*20 

我想挑出其中的20,但是當我跑這個SQL,花了約8秒,這當然,分別出我們的期望。

會有人幫助我?thx。

被修改: 我已經刪除了「PARTITION by tb01.P_USER」,其查詢速度增加了一倍。 目前低於該高管計劃單列: enter image description here

的排序發生的查詢98%的時間,我應該爲此做些什麼呢?如果我必須移除over函數並使用另一種更有效的方法?

+1

[不良習慣踢:使用舊式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style- joins.aspx) - 舊式*逗號分隔的表*樣式列表已停止使用ANSI - ** 92 ** SQL標準(**超過20年**前) –

+0

我知道這一點。我只是拿代碼形式的其他人手,我必須修改此。 – CharlieShi

+0

@marc_s thx編輯this.Now我刪除了「PARTITION by tb01.P_USER」,其查詢速度加倍。 – CharlieShi

回答

0

由於我沒有讀中文,我實際上無法解釋您的執行計劃,但我懷疑當您最終選擇時,大部分此類工作將被丟棄20萬條記錄中有20條記錄。我會假設你正在這樣做,以支持分頁的Web應用程序或智能客戶端。

1)這是你可以每天計算一次並簡單地存儲結果的東西嗎?

2)使用現代ansi連接重寫查詢,並儘可能多地將「where」參數遷移到連接的ON子句中。我知道這在理論上應該沒有關係,但我經常看到查詢優化器用這種方式寫得更好。

3)在你的案例中,從百萬中選擇20行本質上是任意的,因爲你的select語句中沒有order by子句。 SQL Server不保證排序順序在沒有order by子句的情況下是一致的,實際上,每次選擇它時,都會按相同的順序獲取這些數據,直到表統計信息發生變化,以便查詢優化程序更改執行計劃或正在決定重新哈希散列索引。這些東西基本上都可以發生在任意時間。

4)限制在你的查詢中選定的百萬行(不包括rowif)的唯一東西是tb12.CodeId ='410621'。如果這是你能做的最好的,那好吧。但是,你確定你沒有忽視某些東西,甚至可能是你比查詢優化器更瞭解的情況嗎?