2014-01-10 24 views
0

我們的一個客戶想要爲他們的SQL存儲過程引入一個新的編碼標準,這個標準規定所有的子選擇將被臨時表和連接所取代。他們認爲可讀性是導致這種變化的原因。將所有子選擇切換到臨時表並加入影響性能?

我真的不知道了很多關於SQL性能調整的細微之處,但一些有關這讓我覺得它會導致性能問題。我對嗎?

我們正在使用MS SQL,如果這有所作爲。

+2

是的,它可能會導致性能問題。在某些情況下,使用臨時表可能會提高性能,在某些情況下,它們可能會使性能變差。 –

+0

關於他們什麼時候幫助他們,什麼時候他們受傷,是否有任何硬性規定? – eckza

+1

他們知道表變量嗎? - 他們經常出示臨時表格,這在一定程度上取決於規模。 –

回答

2

我擔心這個問題可能過於寬泛,可能會被解釋。

一般情況下,使用中間結果臨時表被繞過SQL Server的查詢優化器。臨時表的創建會產生開銷,創建表並重新讀取數據。例如,考慮簡單地使用子查詢定義不同的列別名以下查詢:

select col3 + 1 
from (select col2 * 2 as col3 
     from (select col1/100 as col2 
      from (select col*col as col1 
        from a 
       ) b 
      ) c 
    ) d 

這種結構的子查詢是相當普遍的,因爲SQL不允許使用列別名在同一水平作爲其定義。實現中間表將對性能產生巨大影響。

在另一方面,存在以下情況:一個查詢可能被構造爲:

with cte as (
     <complex query here> 
    ) 
select . . . 
from cte cte1 join 
    cte cte2 
    on cte1.col = cte2.col; 

在這種情況下,查詢引擎實際上是在CTE子查詢的兩倍。將結果存儲在臨時表中可能會提高性能。

我最大的臨時表的反對意見是維護 - 這是具有諷刺意味爲什麼客戶願意使用它們。例如,更改查詢可能會更改臨時表的結構。在單個查詢中,顯而易見的是保留哪些內容以及刪除哪些內容。作爲一堆臨時表,您有冒險創建不再需要的表。

0

根據數據,以及如何子選擇的orginally使用,它可以提高性能,或者它可能會降低性能。在這種情況下,相關子查詢往往表現不佳,並且臨時表或聯接往往會提高性能。派生表可能比臨時錶快或可能不會取決於返回的行數以及是否索引臨時表。所有這些也取決於特定數據庫的設計以及查詢的其餘部分。有時候表變量或表值函數可能是最好的選擇。這個標準你失去了很多靈活性。

個人而言,我會向他們解釋什麼是可能存在的問題是,什麼其他的方法athere是創建子查詢。如果他們仍然想要這樣做,那就使用這個新標準,但要求修改標準以允許您違反標準,如果您需要調整查詢性能。如果要包含大量記錄,還要確保爲臨時表建立索引。