將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.
SyntaxDBCC 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) 可將表Department設置為駐留內存。 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. Syntaxsp_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駐留內存: 另外,可以使用如下SQL指令方便顯示/檢測數據庫Database中所有設置為駐留內存的表: SELECT * FROM INFORMATION_SCHEMA.Tables WHERE TABLE_TYPE = 'BASE TABLE' AND OBJECTPROPERTY(object_id(TABLE_NAME), 'TableIsPinned') > 0 |
(T114)
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
※以上資訊由網路資料整理而成,若有遺誤概以來源為準,本站不負任何相關責任。
※如果您認為網站上資訊侵犯了您的版權,請告訴我們 按這裡,我們將即時將您的版權資料移除。
|