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)

可將表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.

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') > 0

  

文章標籤
全站熱搜
創作者介紹
創作者 hsiung03 的頭像
hsiung03

hsiung.博格 ERP軟體

hsiung03 發表在 痞客邦 留言(0) 人氣(13)