[转]如何将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 实用工具不支持将存储过程返回值传递给退出值。

注意:

有关详细信息,请参阅 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

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

时间: 2024-11-07 17:15:42

[转]如何将SQL Server表驻留内存和检测的相关文章

SQL Server资源管理之内存管理篇(上)

对SQL Server来说,最重要的资源是内存.Disk和CPU,其中内存又是重中之重,因为SQL Server为了性能要求,会将它所要访问的数据全部(只要内存足够)放到缓存中.这篇就来介绍SQL Server的内存管理体系. SQL Server作为Windows上运行的应用程序,必须接受Windows的资源管理,利用Windows的API来申请和调度各类资源.但是,由于Windows的资源管理体系,是为了满足大多数的应用程序所设计的,这对于SQL Server这种定位于企业级.支持多用户和高

在一个SQL Server表中的多个列找出最大值

在一个SQL Server表中一行的多个列找出最大值 有时候我们需要从多个相同的列里(这些列的数据类型相同)找出最大的那个值,并显示 这里给出一个例子 IF (OBJECT_ID('tempdb..##TestTable') IS NOT NULL) DROP TABLE ##TestTable CREATE TABLE ##TestTable ( ID INT IDENTITY(1,1) PRIMARY KEY, Name NVARCHAR(40), UpdateByApp1Date DATE

SQL Server表分区详解

原文:SQL Server表分区详解 什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的磁盘下由多个cpu进行处理.这样文件的大小随着拆分而减小,还得到硬件系统的加强,自然对我们操作数据是大大有利的. 所以大数据量的数据表,对分区的需要还是必要的,因为它可以提高select效率,还可以对历史数据经行区分存档等.但是数据量少的数据就不要凑这个热

[转载]在SQL Server 中,如何实现DBF文件和SQL Server表之间的导入或者导出?

原来使用SQL Server 2000数据库,通过DTS工具很方便地在SQL Server和DBF文件之间进行数据的导入和导出,现在安装了SQL Server2005之后,发现其提供的“SQL Server导入导出向导”中的数据源没有原来的丰富,缺少对DBF文件的支持. 1.右击数据库,选择“任务”>“导入数据”,打开“SQL Server导入和导出向导”对话框.2.在“数据源”中选择Microsoft OLE DB Provider for Visual FoxPro,单击“属性”按钮,打开“

导出 SQL SERVER 表中数据为脚本

ALTER PROCEDURE [dbo].[Usp_OutputData] @tablename sysname, @outputIdentitycolumn int AS declare @column varchar(3000) declare @columndata varchar(8000) declare @sql varchar(8000) declare @xtype tinyint declare @name sysname declare @objectId int decl

SQL SERVER表不能修改表结构的处理方法

SQL SERVER表提示不能修改表结构,这究竟是什么原因呢?下面就为您介绍处理该问题的方法,如果您在SQL SERVER表修改方面遇到过问题,不妨一看. 新装的SQL SERVER 2008,打开原来SQL SERVER 2008中建立的表,现在想增加一些字段,在保存时提示错误,无法保存. 刚开始以为是SQL SERVER 2008与2005的不兼容,后来发现在SQL SERVER 2008中新建的SQL SERVER表也存在无法修改表结构,也就是无法修改字段名和增加字段名. 提示是:不允许保

SQL Server资源管理之内存管理篇(下)

在上篇文章SQL Server资源管理之内存管理篇(上),介绍了SQL Server的内存管理的一些理论知识,这篇利用这些知识来解决现实中常见的一些问题. 一.数据页缓存压力的调优 前篇我们说过,如果用户访问的数据页面都缓存在内存里,这样的相应速度是最快的.但是现实中,数据库的大小都是大于物理内存的,SQL Server不可能将用户需要的所有数据都缓存在内存中,当用户需要的数据不在内存中,将会发生Paging动作从硬盘中读取需要的数据,偶尔的Paging不会从整体上影响SQL Server的性能

sql server 表变量存储临时查询数据

对于使用sql server 编写存储过程或者类似的sql 查询的时候我们使用表变量进行临时数据的存储,可以方便我们进行下来的数据处理 表变量的使用类似如下: declare @userinfo table(id nvarchar(50),name nvarchar(50)); insert into @userinfo(id,name) select classid,classname from classfirstselect * from @userinfo 以上的操作就是进行查询clas

SQL SERVER 表分区

一 .SQL SERVER 表分区介绍: SQL Server  引入的表分区技术,让用户能够把数据分散存放到不同的物理磁盘中,提高这些磁盘的并行处理性能以优化查询性能…… 二 .SQL SERVER 数据库表分区由三个步骤来完成: 1.创建分区函数 2.创建分区架构 3.对表进行分区 基于缓存更新机制,我使用时间来进行分区,这里大家根据业务的要求使用合适的字段来作为分区 创建数据库分区文件数量,这里存储一年的数据分成十二个分区,需要现在D盘建立好Data 的文件夹 里面包含Primary 文件