2023年5月9日 星期二

SQL Server 各暫存表的差異

會使用暫存表的情境,除了需要對資料做多次操作之外,再者就是要取得的資料過程過於複雜,如子查詢或是JOIN 三張表以上,而暫存表有幾種分類,稍微紀錄差異


暫存表#Table

這類暫存表(單「#」號)是我最常使用的,資料儲存於硬碟(disk),資料於與資料庫的連線 session 中斷時會刪除,

但建議自己手動加入刪除 drop table,無法跨交易或資料庫讀取資料。


以下我們建立一個暫存表 #tmpPersons 並且塞入資料,讀取出來呈現後刪除該暫存表



若此時我們故意等待 30秒來觀察暫存表的生成,並且使用另外一個指述(交易)來讀取該暫存表,

觀察其讀取失敗




等待 30秒後,原本的交易會往下執行並且讀取該暫存表,後續刪除該暫存表



暫存表##Table

這類暫存表(雙「#」號)與單「#」號暫存表同樣是將資料儲存於disk,同樣與資料庫的連線 session 中斷時會刪除,

只是這類表是屬於「全域」,故可以跨資料庫與交易存取的,如以下建立一個 ##tmpPersons




而在等待的過程中使用另外一個指述(交易)來讀取 ##tmpPersons 是可行滴,即使跨資料也可以


暫存表@Table

這類資料表會將資料儲存於 記憶體(memory)中,且無法自行使用 drop table 刪除,該暫存表僅能單一交易使用

,指令執行結束就會自動刪除


以下我們定義一個暫存表@tmpPersons,定義後會在暫存資料庫產生一個隨機的暫存表,

故在等待時間,即使使用語法讀取 @tmpPersons 是讀取不到的





以下列表比較



參考

沒有留言:

張貼留言