• [转]如何将SQL Server表驻留内存和检测


    注意这个功能在SQL2005后已经废弃,因为SQL2005会自动管理哪些表常驻内存。

    将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 textntext, 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 (trueon, or 1) or disabled (falseoff, 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

    为什么我执行 Select ObjectProperty(Object_ID('Department'),'TableIsPinned') 总是返回0,从来没成功过?

    经过查询,原来这个功能在2005版本中就废弃了

    http://msdn.microsoft.com/zh-cn/library/ms144262(v=SQL.90).aspx

    SQL Server 2005 中不支持 SQL Server 早期版本的这些数据库引擎功能。

     

    类别废止的功能替代功能

    备份和还原

    命名管道备份设备。

    磁盘或磁带设备。

    出于安全原因,SQL Server 不支持对命名管道的备份。

    命令提示实用工具

    isql 实用工具

    使用 sqlcmd 实用工具。

     
    sqlcmd 和 osql 实用工具不支持将存储过程返回值传递给退出值。
    ms144262.note(zh-cn,SQL.90).gif注意:

    有关详细信息,请参阅 sqlcmd 实用工具

    配置选项

    sp_configure 的 'allow updates' 选项。

    存在该选项但不支持对系统表直接更新

    配置选项

    sp_configure 的 'open objects' 选项。

    存在该选项,但其功能已停用。在 SQL Server 2005 中,打开的数据库对象的数量是动态管理的,该数量只受可用内存的限制。sp_configure 中保留了 'open objects' 选项,以确保向后兼容现有脚本。

    配置选项

    sp_configure 的 'set working set size' 选项

    存在该选项,但其功能已停用。

    数据库创建

    DISK INIT

    DISK RESIZE

    来自 SQL Server 6.x 的早期行为

    数据库创建

    CREATE DATABASE 的 FOR LOAD 选项

    RESTORE 操作可创建数据库

    DBCC

    DBCC DBREPAIR

    使用 DROP DATABASE 可以删除已损坏的数据库。

    有关详细信息,请参阅 DROP DATABASE (Transact-SQL)

    DBCC

    DBCC NEWALLOC

    DBCC CHECKALLOC

    有关详细信息,请参阅 DBCC (Transact-SQL)

    DBCC

    DBCC PINTABLE,DBCC UNPINTABLE

    无。

    DBCC

    DBCC ROWLOCK

    行级锁定为自动。

    DBCC

    DBCC TEXTALL

    DBCC TEXTALLOC

    DBCC CHECKDB

    DBCC CHECKTABLE

    扩展存储过程编程

    当存在来自原始登录的模拟上下文切换时,请使用 SRV_PFIELD 结构中的 SRV_PWD 字段。

    无。

    网络协议

    以下协议:NWLink IPX/SPX、AppleTalk、Banyan Vines 和多协议。

    将您的应用程序和数据库引擎的实例配置为使用以下受支持的协议之一:TCP/IP 套接字、named pipes、VIA 或 shared memory。

    有关详细信息,请参阅选择网络协议

    重新生成 master

    Rebuildm.exe

    在 Setup.exe 中使用 REBUILDDATABASE 选项。

    有关详细信息,请参阅如何从命令提示符安装 SQL Server 2005

    示例数据库

    Northwind 和 pubs

    使用 AdventureWorks;但是,可通过下载或从 SQL Server 的早期版本中复制而得到 Northwind 和pubs

    有关详细信息,请参阅示例和示例数据库

    Setup.exe

    远程安装 - 不支持 TARGETCOMPUTER 参数。

    使用远程连接以用户界面模式或从命令行提示符运行 SQL Server 安装程序。

    API

    基于 SQL-DMO 的 WMI 提供程序

    托管代码:Microsoft.SqlServer.Management.Smo.Wmi

    非托管代码:WMI Provider for Configuration Management

    API

    SQL 命名空间 API (SQL-NS)

    Transact-SQL

    *= 和 =* 外部联接运算符

    使用 FROM 子句的 JOIN 语法。

    有关详细信息,请参阅 FROM (Transact-SQL)

    虚拟表

    syslocks

    sys.dm_tran_locks

    有关详细信息,请参阅 sys.dm_tran_locks

  • 相关阅读:
    快速指引(CDH6.3.2)
    gRpc 跨语言调用(NetCore 与 Spring Boot)
    Windows 极简利器
    Jenkins 于Docker 中源配置
    Kettle 问题
    在 Ubuntu 下直接将二进制文件制作成 rpm 包
    麒麟常见问题
    基于jssip的简单封装
    带有handleEvent的eventEmitter
    js集锦
  • 原文地址:https://www.cnblogs.com/relax/p/3785599.html
Copyright © 2020-2023  润新知