2016-11-04 55 views
0

我有大約80列的表「BigTable」,但我需要生成一個「Rank」列,我將在更新期間使用它。截至目前,我的查詢看起來像這樣。連接表中的列數是否影響性能

UPDATE bt 
SET bt.UpdateColumn = CASE WHEN (SomeCondition >= bt.RankField) 
          THEN bt.UpdateColumn + 0.01 
          ELSE bt.UpdateColumn 
         END 
FROM (SELECT bt.*,RANK() OVER (PARTITION BY Col1 ORDER BY Col2) AS RankField FROM BigTable bt) bt 
    INNER JOIN AnotherTable atbl 
     ON bt.Col1 = atbl.Col2 

請問,如果我我的代碼更改一些像這樣的事情是更好。派生表中的列數是否在連接期間很重要。

UPDATE bt 
SET bt.UpdateColumn = CASE WHEN (SomeCondition >= bt.RankField) 
          THEN bt.UpdateColumn + 0.01 
          ELSE bt.UpdateColumn 
         END 
FROM (SELECT bt.Col1,RANK() OVER (PARTITION BY Col1 ORDER BY Col2) AS RankField FROM BigTable bt) bt 
    INNER JOIN AnotherTable atbl 
     ON bt.Col1 = atbl.Col2 
+0

如果您擔心性能問題,然後測試添加索引是否有幫助。加入索引字段將顯着改善性能。增加你加入的表的數量將不可避免地減慢結果檢索 - 這就是爲什麼i.m.o.我們需要始終優化我們的連接和表索引。 –

回答

0

使用子查詢根本沒有區別。

SQL Server有一個很好的優化器。優化程序所做的一件事就是在開始將頁面數據加載到工作內存中時,從數據頁面中選擇所需的列。實際上,SQL Server經常會將列上的表達式也推入到這個階段。

沒有理由把這樣的子查詢放在沒有必要的地方。

+0

對不起我的錯,它不是一個子查詢,而是一個派生表(這是否有所作爲?)。此外,我需要在我的更新中使用Rank字段。在那種情況下,還有更好的辦法嗎? – Prakazz

+0

@Prakazz。 。 。他們是一樣的東西。是的,它完全一樣。優化器非常聰明。 –

0

希望您的數據庫設計可以根據您的要求。 希望您正確處理您的需求。 這兩個是最基本的東西。

試試這個,如果該查詢是速度不夠快,那麼你可以考慮創建索引等 BTW,知道「somecondition」是必要的編寫正確的查詢。

UPDATE bt 
    SET bt.UpdateColumn = bt.UpdateColumn + 0.01      
    FROM (SELECT bt.Col1,RANK() OVER (PARTITION BY Col1 ORDER BY Col2) AS RankField FROM BigTable bt) bt 
     INNER JOIN AnotherTable atbl 
      ON bt.Col1 = atbl.Col2 
    where bt.RankField<=SomeCondition 
相關問題