2013-07-27 182 views
-1

Update table Data without using while loop in sql server 2005計算運行總計運行在SQL Server 2005

我問這個問題和細節,更好的性能....

在SQL我有一個表中的數據如下

id  type  amount  
1  type1  2000  
2  type1  1000  
3  type2  500  
4  type3  3000  
5  type1  2000 
6  type2  500   
7  type3  5000  
8  type1  1000  

和我想獲得像下面這樣的語句中的數據

id  type  amount  current 
1  type1  2000   2000     
2  type1  1000   1000     
3  type2  500   500     
4  type3  3000   3000     
5  type1  2000   3000     
6  type2  -500   0     
7  type3  5000   2000 
8  type1  -1000   4000 

a ND等 這意味着每種類型必須基於量型 其需要被不具有其目前的總金額有while循環,因爲它需要很長的時間來執行

for eg: 

in type 1 

ID  Amount  current 
1  2000-add  2000     
2  1000-sub  1000     
3  2000-add  3000     
4  1000-add  4000     

,答案是,

SELECT id, 
     type, 
     amount, 
     (SELECT sum(amount) 
     FROM mytable t1 
     WHERE t1.type = t2.type 
       AND t1.id <= t2.id) currenttotal 
FROM mytable t2 

現在的問題是假設的例子表有8000(它會增加),如

id  type  amount  
1  type1  2000  
2  type1  1000  
3  type2  500  
4  type3  3000  
5  type1  2000 
6  type2  500   
7  type3  5000  
8  type1  1000 

及其採取012的數據記錄執行select語句的時間是基於這個答案(有2個答案,兩者有相同的執行時間)針對上述問題編寫的。如何減少這個執行時間?

+0

*如何減少這個執行時間?*你有索引來支持查詢嗎?我假設你至少看過執行計劃。 –

+0

Downvoted請填寫詳細信息。 – Namphibian

+0

該查詢的適當索引是'type,id INCLUDE(amount)',儘管如果每個'type'性能有很多行,那麼這個索引仍然會很糟糕。 –

回答

2

嘗試

CREATE UNIQUE INDEX IX ON YourTable(type,id) INCLUDE (amount) 

只要每type行數沒有得到太大你提問中的查詢應該沒問題。

與以前版本相比,SQL Server 2012對計算運行總數有更好的支持。在SQL Server 2012中你可以做

SELECT id, 
     type, 
     amount, 
     SUM(amount) OVER (PARTITION BY type 
         ORDER BY id ROWS UNBOUNDED PRECEDING) currenttotal 
FROM mytable t2 
+0

請詳細解釋並舉例說明我給出的上述數據...請 – Suresh

+0

@Suresh - 我的建議是在你的桌子上創建一個索引。我沒有給你一個真正的例子。我的答案中的第一行代碼是完成此操作的完整語法。創建索引希望意味着您現有的查詢將在可接受的時間內運行。 –

+0

'無界前衛'是指? – Suresh