设为首页 收藏本站
查看: 649|回复: 0

[经验分享] 如何将SQL Server表驻留内存和检测

[复制链接]

尚未签到

发表于 2016-11-4 00:33:50 | 显示全部楼层 |阅读模式
  将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
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-295233-1-1.html 上篇帖子: SQL SERVER登录用户在服务器上的权限 下篇帖子: sql server行转列问题终极解决
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表