none
cte 是否效能較好? RRS feed

  • 問題

  • 您好:

    請問,CTE 他是把資料先存到暫存區,再供後續的運算,這樣針對i/o 讀取較省?但整體程本會比較好嗎?

    因為有試過,發先先把資料取出後,供後續使用,但成本反額偏高?

    57%成本
    with AY As (
      select * from AA
    ),BX AS (
      select * FROM B WHERE b.X in (select distinct x from A)
    ),CJ as(
      select * from  AY join BX ..
    ),DJ as (
      select * from AY join BX
    )select ...


    與  43%成本
    with AY As (
      select * from AA
    ),CJ as(
      select * from AY join B ..
    ),DJ as (
      select * from AY join B
    )select ...

    2012年10月30日 上午 01:57

解答

  • You may don't like this one, but truth is depends on how you use it.
    2012年10月30日 上午 03:04
  • Hi ,

    如同rmiao前輩所說,效能如何要看你怎麼用,我整理了T-SQL指令碼中,多種暫時結果集選項給您參考:

    l   一般資料表運算式(CTE):具有檢視(View)和衍生資料表的能力,可以視為暫存的檢視

    l   衍生資料表 (derived table)

    l   Table資料型別變數 (@table)

    l   暫存資料表 (#Table)

    什麼時候要用哪一種方法,取決於使用這些方法的頻率時間長短資料筆數多寡

    l   生命週期僅限於查詢期間

    • 衍生資料表和CTE都不會儲存成資料庫物件,而且生命週期僅限於查詢期間
    • 以衍生資料表和CTE比較,CTE可以減少重覆計算所耗的I/OCPU和執行時間
    • 衍生資料表和CTE不同的地方是CTE可以自我參考(遞迴),可以在同一查詢中被參考多

    l   生命週期與連線同在

    • @tablem先在記憶體運算,所以效能較好,適合用在資料量少,有複雜計算的時候
    • #Table因為有支援建立索引,適合用在筆數很多,資料量很大或很複雜的查詢時,有index可以加快查詢效能
    • @tablem生命週期僅存在SQL批次或是定義他們的預存程序裡;如果要在多個批次或預存程序之間使用,就必須用#Table

    以上說明若有錯誤請指教,謝謝。 參考資料:章立民研究室與悅之文化

    • 已標示為解答 softballnow 2012年11月1日 上午 03:25
    2012年10月31日 上午 01:27

所有回覆

  • You may don't like this one, but truth is depends on how you use it.
    2012年10月30日 上午 03:04
  • Hi ,

    如同rmiao前輩所說,效能如何要看你怎麼用,我整理了T-SQL指令碼中,多種暫時結果集選項給您參考:

    l   一般資料表運算式(CTE):具有檢視(View)和衍生資料表的能力,可以視為暫存的檢視

    l   衍生資料表 (derived table)

    l   Table資料型別變數 (@table)

    l   暫存資料表 (#Table)

    什麼時候要用哪一種方法,取決於使用這些方法的頻率時間長短資料筆數多寡

    l   生命週期僅限於查詢期間

    • 衍生資料表和CTE都不會儲存成資料庫物件,而且生命週期僅限於查詢期間
    • 以衍生資料表和CTE比較,CTE可以減少重覆計算所耗的I/OCPU和執行時間
    • 衍生資料表和CTE不同的地方是CTE可以自我參考(遞迴),可以在同一查詢中被參考多

    l   生命週期與連線同在

    • @tablem先在記憶體運算,所以效能較好,適合用在資料量少,有複雜計算的時候
    • #Table因為有支援建立索引,適合用在筆數很多,資料量很大或很複雜的查詢時,有index可以加快查詢效能
    • @tablem生命週期僅存在SQL批次或是定義他們的預存程序裡;如果要在多個批次或預存程序之間使用,就必須用#Table

    以上說明若有錯誤請指教,謝謝。 參考資料:章立民研究室與悅之文化

    • 已標示為解答 softballnow 2012年11月1日 上午 03:25
    2012年10月31日 上午 01:27
  • 謝謝大家!
    2012年11月1日 上午 03:26