存档

2010年2月 的存档,文章数:12

CSDN上有篇帖子http://topic.csdn.net/u/20100223/15/644e6212-9fdc-42de-81ad-785d28ed71d3.html 讨论查询计划读取索引页的问题。 主要问题是: 在一张建有聚集索引(没有其它非聚集索引)的表执行select count(*) 。查询显示扫描了所有的索引中间层叶。从理论上讲,由于每个数据页都记录着它的上一个page和下一个page,那么最小的io读取应该是: 读根页—>读最小的中间页—>读数据叶子—->依次往后读全部数据页. 但实际上却是读取全部的索引中间页。 帖子中比较精彩的回复: 1 2 3 4 5 首先楼主的说法不够准确,根据我的测试结果来看,更准确的说法应该是sql server在做索引全扫(INDEX FULL scan)时,会先扫描全部的level 1的节点,然后在扫描处于level 0的叶节点。也就是说一次索引全扫的顺序是(这个顺序对于clustered INDEX和普通INDEX都是一样的): 读根页—>读最小的中间页(level 1以上的层)—>依次读level 1的所有节点的索引页—->读全部数据页 上述顺序可以在将数据表索引层数增加到3层以上时得到验证。 实际上我觉得sql server这样做是很有道理的,楼主认为的是所读的页越少,io就越小,这是不对的。对于sql server来说,一次io并不一定只读取一个页,很多时候特别是做表全扫或索引全扫时,sql server都会尽量的让一次io读取尽可能多的数据页,这样才能较少io的次数。为达到这个目的,sql server首先就要知道它到底需要读取那些页,知道要读取页的分布之后,就可以安排io调度器尽可能的将临近的数据页用一次io读取上来,而要知道需要读取数据页的分布就需要先读取到level 1上的所有页,以找出要读取io页的分布情况,然后再做最优的io读取安排。 同样的道理,如果sql server是先定位到叶节点的起始数据页,然后从依次的读取所有的数据页的话,那sql server就只能一次io读取一个数据页,然后找出对应的下一页的指针,再去读取下一个数据页,这样实际上花费的io会远比批量读取数据页多很多的。这就好比我们在做表的lookup时,如果需要lookup的行非常之多的话sql server会转而选择表扫描来达到目的的。 预读 我觉得SQL Server内部存在这样一个机制: 它会尽量将当前使用的及使用最频繁的表的数据都带到buffer中来,这跟buffer的算法有一定的关系。 清掉buffer後,你不做任何动作,隔几秒钟,sql会自动将master库中一些比较重要的表都带到buffer中,或者 你select * from tb where 1 <>1 ,尽管该查询不会扫描任何数据,但sql还是会自动将tb的所有索引页到带到 buffer中去,因为它可能觉得tb这个表後续可能会使用到. 关于计算逻辑读的数量 IAM页是否会计算在逻辑读中我都是持怀疑态度的。 比如说,一个堆表扫描时肯定是从IAM页开始的,然而用set statistics io on看到的逻辑读数量却只是表所占用的总页数,并没有加上相应的IAM页数量。 [...]

– 创建测试数据库 CREATE DATABASE Db GO — 对数据库进行备份 BACKUP DATABASE Db TO DISK = ‘ c:\db.bak ‘ WITH FORMAT GO — 创建测试表 CREATE TABLE Db.dbo.TB_test(ID int ) — 延时1秒钟,再进行后面的操作(这是由于SQL Server的时间精度最大为百分之三秒,不延时的话,可能会导致还原到时间点的操作失败) WAITFOR DELAY ‘ 00:00:01 ‘ GO — 假设我们现在误操作删除了 Db.dbo.TB_test 这个表 DROP TABLE Db.dbo.TB_test — 保存删除表的时间 SELECT dt = GETDATE () INTO # GO — 在删除操作后,发现不应该删除表 [...]

在sybase表上建立聚集索引可以提高键列的检索速度。这是索引的主要功能所在。 可是,聚集索引对于统计表上的行数count(*)有没有改善呢? 答案是否定的。 请看我下面的测试代码! 建立一张临时表test3 1 create table test3(id int not null,name varchar(30) null) 向表中插入测试数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 insert into test3 select 1,’liu’ go insert into test3 select 2,’zhang’ go insert into test3 select 3,’wang’ go insert into test3 select 4,’li’ go 循环插入 [...]

随着当今数据库的容量越来越快的朝着在大型数据库或超大型数据库的发展,对于数据库中的大型表以及具有各种访问模式的表的可伸缩性和可管理性运行环境变得 尤为重要,SQL server从SQL server 7.0的分区视图到SQL server 2000中的分区视图中到SQL server 2005所使用的分区表,不断改善大型表所面临的性能、阻塞、备份空间、时间、运营成本等。当表和索引非常大的时候,通过分区表的实现,可以将数据分为更 小,更易于管理,获得更好的可操作性能。本实验介绍基于已存在的表来如何创建分区,管理分区。 一、实验目的:对于已经存在的表且不断增大的情况下构建分区表,管理分区表,提高其性能。 二、主要步骤:对于已经存在的表,我们可以采取以下步骤来对其创建分区表 1.创建分区函数 2.创建分区架构并关联到分区函数 3.删除已经存在的聚集索引 4.基于分区架构重建聚集索引 三、实验环境: 1. windows xp pro (英文版) + sp2 2. SQL server 2005 Developer + sp3 3.实验数据库Performance,此数据库参照实验二:SQL server 2005高可用性之—-数据库镜像 中的生成脚本生成数据库,本实验对其数据库的存放做了调整,将数据和日志文件存放在D:\SQL_Data\Performance目录下。 4.对已存在要创建的分区表为:Performance数据库下的Orders表. 5.对Orders表中的orderdate列按年进行水平分区 四、具体试验步骤: 1.创建分区函数 确定分区的数目及分区的列,列的数据类型。本例将Orders表的orderdate按年份水平分五个区,则需要定义四个边界点值。如下, use Performance; go Create partition function Part_func_orders(datetime) as range left for values(’20021231 23:59:59.997′, ’20031231 23:59:59.997′, [...]

今天下午在本机测试环境下成功恢复了drop table操作后的表内的数据。 配合使用dbcc page, dbcc pglinkage,dbcc allocdump,并利用“欺骗”dataserver的办法将数据恢复出来。用了不到半个小时的时间恢复了一张有几十万行记录的表。操作的详细步骤用屏幕录像软件进行了记录保存。 ———————————————————————————————————— ——— 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载; ——— 转载务必注明原始出处 : http://www.dbainfo.net ——— 关键字: 恢复 误操作  drop truncate  dbcc page pglinkage allocdump ————————————————————————————————————

近期因工作需要,希望比较全面的总结下 SQL SERVER 数据库性能优化相关的注意事项,在网上搜索了一下 , 发现很多文章 , 有的都列出了上百条 , 但是仔细看发现,有很多似是而非或者过时 ( 可能对 SQL SERVER6.5 以前的版本或者 ORACLE 是适用的 ) 的信息,只好自己根据以前的经验和测试结果进行总结了。 我始终认为,一个系统的性能的提高,不单单是试运行或者维护阶段的性能调优的任务,也不单单是开发阶段的事情,而是在整个软件生命周期都需要注意,进行有效工作才能达到的。所以我希望按照软件生命周期的不同阶段来总结数据库性能优化相关的注意事项。 一、 分析阶段 一般来说,在系统分析阶段往往有太多需要关注的地方,系统各种功能性、可用性、可靠性、安全性需求往往吸引了我们大部分的注意力,但是,我们必须注意,性能是很重要的非功能性需求,必须根据系统的特点确定其实时性需求、响应时间的需求、硬件的配置等。最好能有各种需求的量化的指标。 另一方面,在分析阶段应该根据各种需求区分出系统的类型,大的方面,区分是 OLTP (联机事务处理系统)和 OLAP (联机分析处理系统)。 二、 设计阶段 设计阶段可以说是以后系统性能的关键阶段,在这个阶段,有一个关系到以后几乎所有性能调优的过程 — 数据库设计。 在数据库设计完成后,可以进行初步的 索引设计 ,好的索引设计可以指导编码阶段写出高效率的代码,为整个系统的性能打下良好的基础。 以下是性能要求设计阶段需要注意的: 1、 数据库逻辑设计的规范化 数据库逻辑设计的规范化就是我们一般所说的范式,我们可以这样来简单理解范式: 第 1 规范:没有重复的组或多值的列,这是数据库设计的最低要求。 第 2 规范 : 每个非关键字段必须依赖于主关键字,不能依赖于一个组合式主关键字的某些组成部分。消除部分依赖,大部分情况下,数据库设计都应该达到第二范式。 第 3 规范 : 一个非关键字段不能依赖于另一个非关键字段。消除传递依赖,达到第三范式应该是系统中大部分表的要求,除非一些特殊作用的表。 更高的范式要求这里就不再作介绍了,个人认为,如果全部达到第二范式,大部分达到第三范式,系统会产生较少的列和较多的表,因而减少了数据冗余,也利于性能的提高。 2、 [...]

SQL Server安装出错问题解决汇总 先把SQL Server卸载,再把安装时产生的“Microsoft SQL Server”文件夹删掉,在运行注册表,把HKEY_CURRENT_USER\\Software\\Microsoft\\Microsoft SQL Server,和HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SQL Server全部删掉,(注意要把Microsoft SQL Server文件夹整个删掉),然后重起。 再装就应该没有问题了! Win2k 装不上 SQL Server 2000 问题很常见. // (1)配置服务器时中断. // (2)注册 ActiveX 时中断. // (3)显示到100%的时候中断. 当然重新安装 Windows 2000 完全可以安装 SQL Server 2000. 安全起见: 1>先备份您的注册表. 2>备份您的数据[进不了SQL Server 2000, 可以备份 Program Files\\Microsoft SQL Server\\MSSQL\\Data 文件夹的文件.] 您必须知道: Windows 2000 Server 可以安装SQL Server 2000的任何版本. Windows 2000 Professional [...]

SQL Server的补丁版本检查不如Windows 补丁版本检查直接,一个系统管理员,如果不了解SQL Server版本对应的补丁号,可能也会遇到一点麻烦,因此在这说明一下,通过这样的办法判别机器是安全的办法,不会对系统产生任何影响。   1、用Isql或者SQL查询分析器登录到SQL Server,如果是用Isql,请在cmd窗口输入isql -U sa,然后输入密码,进入;如果是用SQL查询分析器,请从程序中启动,输入sa和密码(也可以用windows验证)。   2、在ISQL中输入: Select @@Version; go 或者SQL查询分析器中输入(其实如果不想输入,只要打开帮助的关于就可以了:)) Select @@Version; 然后按执行; 这时会返回SQL的版本信息,如下: Microsoft SQL Server 2000 – 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 3) 其中的8.00.760就是SQL Server的版本和补丁号。对应关系如下: 8.00.194 -——————SQL Server 2000 RTM 8.00.384 [...]