將SQL Server資料表駐留記憶體是SQL Server提供的功能,在一般小型系統的開發過程中估計很少會涉及。這裡整理了相關文件資料,示範如何把SQL Server中一個表格的所有資料放入記憶體中,實現記憶體資料庫,提升即時性。
1, DBCC PINTABLE
Marks a table to be pinned, which means Microsoft SQL Server does not flush the pages for the table from memory.
Syntax
DBCC PINTABLE ( database_id , table_id )
To determine the database ID, use the DB_ID function.
To determine the table ID, use the OBJECT_ID function.
註釋
DBCC PINTABLE 不會導致將表格讀入記憶體中。當表格中的頁由普通的Transact-SQL 語句讀入到快取中時,這些頁將標記為記憶體駐留頁。當SQL Server 需要空間以讀入新頁時,不會清空記憶體駐留頁。 SQL Server 仍然記錄對頁的更新,並且如有必要,將更新的頁寫回磁碟。然而,在使用DBCC UNPINTABLE 語句使該表不駐留之前,SQL Server 會在快取中一直保存可用頁的複本。
DBCC PINTABLE 最適用於將小的、經常引用的表保存在記憶體中。將小表的頁一次讀入到記憶體中,將來對其資料的所有引用都不需要從磁碟讀入。
注意 DBCC PINTABLE 可以提供效能改進,但使用時請務必小心。如果駐留大表,則該表在開始時會使用一大部分高速緩存,而不為系統中的其它表保留足夠的高速緩存。如果所駐留的表比快取大,則該表會填滿整個快取。 sysadmin 固定伺服器角色的某個成員必須關閉而後重新啟動SQL Server,然後讓表格不駐留。駐留太多的表和駐留比高速緩存大的表會產生同樣的問題。
範例:
Declare @db_id int, @tbl_id int
Use DATABASE_NAME
Set @db_id = DB_ID('DATABASE_NAME')
Set @tbl_id = Object_ID('Department')
DBCC pintable (@db_id, @tbl_id)
資料表可駐留記憶體。
Declare @db_id int, @tbl_id int
Use DATABASE_NAME
Set @db_id = DB_ID('DATABASE_NAME')
Set @tbl_id = Object_ID('Department')
DBCC UNpintable (@db_id, @tbl_id)
可將資料表Department') 取消設定記憶體。
可以使用以下的SQL指令來偵測執行情況:
Select ObjectProperty(Object_ID('Department'),'TableIsPinned')
如果傳回結果為1:則表示該表已設定為駐留記憶體;0:則表示沒有設定為駐留內存。
2, SP_TableOption
Sets option values for user-defined tables. sp_tableoption may be used to turn on the text in row feature on tables with text, ntext, or image columns.
Syntax
sp_tableoption [ @TableNamePattern = ] 'table'
, [ @OptionName = ] 'option_name'
, [ @OptionValue = ] 'value'
其中,'option_name' 有以下用法:
pintable -- When disabled (the default), it marks the table as no longer RAM-resident. When enabled, marks the table as RAM-resident. (可將指定的表駐留內存)
另外,table lock on bulk load, insert row lock, text in row等等可選值,因不涉及將表駐留內存,具體用法可以查詢SQL Server Books Online.
Value有下列用法:
the option_name is enabled (true, on, or 1) or disabled (false, off, or 0)
範例:
EXEC sp_tableoption 'Department','pintable', 'true'
將資料表Department駐留記憶體
EXEC sp_tableoption 'Department','pintable', 'false'
取消資料表Department駐留內存
可以使用以下的SQL指令來偵測執行情況:
Select ObjectProperty(Object_ID('Department'),'TableIsPinned')
如果傳回結果為1:則表示該表已設定為駐留記憶體;0:則表示沒有設定為駐留內存。
3. Conclusions
將資料表設定為駐留記憶體時,並沒有實際將表讀入記憶體中,直到該表從被檢索。因此,可以使用下列SQL指令進一步將資料表Department駐留記憶體:
Select * From Department
另外,可以使用下列SQL指令方便顯示/偵測資料庫Database中所有設定為駐留記憶體的資料表:
SELECT * FROM INFORMATION_SCHEMA.Tables
WHERE TABLE_TYPE = 'BASE TABLE'
AND OBJECTPROPERTY(object_id(TABLE_NAME), 'TableIsPinned'), 'TableIsPinned') > TableIsPAME), 'TableIsPinned') > 0