2013年6月24日

SQL - 檢視(view),暫存資料表(#Table),資料表變數(@Table),衍生資料表(子查詢),一般資料表(CTE)

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

1.檢視(view):
http://msdn.microsoft.com/zh-tw/library/ms187956.aspx

a.生命週期 - 存在於資料庫中,可提供給所有批次或預存程序反覆使用.
b.特  點 - 如僅需使用一次則較不適合.
c.使用時機 - 用來分解大型查詢,以便用更容易閱讀的方式加以查詢.

===============================================
2.暫存資料表(#Table):
http://msdn.microsoft.com/zh-tw/library/ms174979(v=sql.105).aspx#languageReferenceRemarksToggle

a.生命週期 - 在多個批次或預存程序裡.
b.特  點 - 存在於"tempdb".
                   可建立索引(index).
                   當session 關閉時,#Table 將會自動DROP,但最好手動DROP.
c.使用時機 - 適合用在資料量大的查詢,有複雜計算時.

例:
CREATE TABLE #TempTable (
                                                        id INT,
                                                        name VARCHAR(30) 

                                                       )

INSERT INTO ...

DROP TABLE #TempTable 



SELECT * INTO #TempTable 
    FROM table 
 WHERE ...

DROP TABLE #TempTable 

===============================================
3.資料表變數(@Table):
http://msdn.microsoft.com/zh-tw/library/ms188927.aspx#code-snippet-3

a.生命週期 - 存在單次批次期間或預存程序裡.
b.特  點 - 先在記憶體運算.
c.使用時機 - 適合用在資料量少,有複雜計算時.

例:

DECLARE @TempTable TABLE (
                                                             id INT,
                                                            name VARCHAR(30) 

                                                            )
INSERT INTO ...

SELECT name 
    FROM table AS A 
   INNER JOIN @TempTable B
         ON A.id=B.id

===============================================

4.衍生資料表(子查詢):

a.生命週期 - 僅限於查詢期間.

b.特  點 - 如需使用多次可能會使得查詢更難閱讀及維護.
c.使用時機 - 同樣的查詢僅使用一次時.

例:

SELECT id 
     FROM tableA 
 WHERE name=(SELECT name 
                                   FROM tableB 
                                WHERE ... )

===============================================
5.一般資料表(CTE):
http://msdn.microsoft.com/zh-tw/library/ms175972.aspx

a.生命週期 - 僅限於查詢期間
b.特  點 - 可以減少重覆計算所耗的I/OCPU和執行時間.
                   可以自我參考(遞迴),可以在同一查詢中被參考多次.
                   需緊接在下個查詢中才能使用.
c.使用時機 - 同樣的查詢使用多次時.

例:

;WITH TableCTE(id,dataCount) AS(
            SELECT id,COUNT(id)
                FROM table 
             GROUP BY ...
)

SELECT name 
    FROM table AS A 
   INNER JOIN TableCTE  B
         ON A.id=B.id

===============================================










2 則留言:

  1. Casino Bonus Code NJVIP - Promo Code for $10 & 100 Free Spins
    Casino Bonus Code NJVIP. 포항 출장안마 Online 통영 출장샵 Casino Bonus: NJVIP: $10 & 100 Free Spins New 포항 출장마사지 Player Promo Code: 군포 출장샵 PLAYNJFREE! 순천 출장안마 No Code Required!

    回覆刪除