时间:2021-07-01 10:21:17 帮助过:17人阅读
--测试即时文件初始化 CREATE DATABASE [TestFileInit] ON PRIMARY ( NAME = N‘TestFileInit‘, FILENAME = N‘F:\DBBackup\TestFileInit.mdf‘ , SIZE = 41943040KB , FILEGROWTH = 1024KB ) LOG ON ( NAME = N‘TestFileInit_log‘, FILENAME = N‘F:\DBBackup\TestFileInit_log.ldf‘ , SIZE = 1024KB , FILEGROWTH = 10%) GO
(Figure7:之前创建时间)
(Figure8:之后创建时间)
注意:禁用即时文件初始化功能,要想让这个禁用生效,一样需要重启SQL Server (MSSQLSERVER)服务。
1. 在安装SQL Server的时候,如何设置会使得SQL Server服务是以【网络服务】登陆的?
2. 禁用掉SQL Server的协议Shared Memory,这个协议是用来干嘛的?有什么作用?
3. 如果把NT AUTHORITY\NETWORKSERVICE加入到Windows组里面有什么不安全隐患嘛?
4. 当启用 TDE 时,即时文件初始化功能不可用。什么是TDE?
数据库文件初始化
为SQL Server 2005配置Windows即时初始化
Local System/Network Service/Local Service权限详解
开文之前首先要讲讲几个概念
【覆盖查询】
当索引包含查询引用的所有列时,它通常称为“覆盖查询”。
【索引覆盖】
如果返回的数据列就包含于索引的键值中,或者包含于索引的键值+聚集索引的键值中,那么就不会发生Bookup Lookup,因为找到索引项,就已经找到所需的数据了,没有必要再到数据行去找了。这种情况,叫做索引覆盖;
【复合索引】
和复合索引相对的就是单一索引了,就是索引只包含一个字段,所以复合索引就是包含两个或者多个字段的索引;
【非键列】
键列就是在索引中所包含的列,当然非键列就是该索引之外的列了;
下面就开始今天的主题
【摘要1】
在 SQL Server 2005 中,可以通过将非键列添加到非聚集索引的叶级别来扩展非聚集索引的功能。通过包含非键列,可以创建覆盖更多查询的非聚集索引。这是因为非键列具有下列优点:说明:第一:只能是针对非聚集索引;第二:比起复合索引是有性能上的提升的,因为索引的大小变小了;
【摘要2】
键列存储在索引的所有级别中,而非键列仅存储在叶级别中。说明:这就表现为包含与不包含的关系了。有关索引级别的详细信息,请参阅表组织和索引组织。
【摘要3】
使用包含性列以避免大小限制说明:当你把一个nvarchar(500)的字段设置为主键的时候,你就可以看到不能超出900字节的提示了。一般来说我们是不太会做这些操作的,所以那个错误提示也是不常见的,也许你可能还见过。
一个数据页的大小才8k,所以我们合理的设置每个字段的大小,不要浪费太多的空间,这样对查询也是有好处的,这个include就比较好的的解决了索引和空间的问题,虽然那些include的数据也会占用空间。
虽然可以设置include,但是也尽量不要使用太多的字段作为索引包含的非键列。
【摘要4】
带有包含性列的索引准则说明:include不能使用在聚集索引中。后面的两点,这个在实际中很难想象会有这样的需求要把重复列放到一个索引中。如果有朋友遇到过这样的需求可以告知一些,不胜感激。那如果有是否可以通过不同的列名(其实保存是同样的值)来解决这个问题呢??
【摘要5】
列大小准则说明:varchar(max)这样的定义是在2005之后才有的,所以这些数值也是对2005后的版本才生效的。
最大的表列数为:1024
最大非键列数为:1023
【摘要6】
修改已定义为包含性列的表列时,要受下列限制:说明:这些细小的东西一直没有注意过。所以要记录下来,用来“防身”,呵呵。
【摘要7】
设计建议
说明:也就是说把常用的where后面的条件查询的字段作为索引的键列,而需要返回的字段就作为索引包含的非键列。
如果where的是两个或两个以上的谓词的话,这个索引就可以创建为复合索引了。以前天真的认为要返回的字段只能通过在复合索引中入这些字段,不管它是否会用来做谓词。看到这篇文章,才有了豁然开朗的感觉。
【摘要8】
USE AdventureWorks;说明:这个是使用include的语法,在表的设计中的索引设计中是没有办法选择的;
【摘要9】
性能注意事项说明:“这是因为列值被复制到了索引叶级别”这句很好的说明了物理上的存储结构和原理。
【图片解析】
上图也说明了为什么不能在聚集索引中建立具有包含性列的索引,因为非聚集索引的叶层是由索引页而不是由数据页组成,这就得说到聚集和非聚集索引的的物理存储了,聚集索引的顺序排序和存储就是基表的顺序和存储结构。
【一个例子】
SELECT UserName,Password,RealName,Mobile,Age FROM bw_Users WHERE UserName = XXX AND Age = XX
说明:
前段时间在忙数据库的表分区,经常会去上网找资料,但是在找到都是测试表分区的文章,没有实战经验的,所以在我把表分区运用到实际项目中的时候遇到了很多问题。
比如:如何确认分区字段?分区字段与聚集索引的区别与联系?如何存储分区索引?MSDN说交换分区是以秒计算,但执行40G交换分区超时?如何解决分区不断增长的问题?自动化交换分区的陷阱?
这些问题都只能自己在实战中摸索答案,后来我写了几篇关于这些问题的博文,希望对那些需要实战帮助的童鞋有一点提示和帮助。希望大家拍砖。
某生产数据库大小已经有800G了,每天进库数据量大概有150W条记录(数据空间大概为7G),而服务器现在已经没有太多的磁盘空间了,面对这样的问题,我决定对这个数据库的一个大表做表分区,每个分区的ndf文件为40G,一个分区存储1千万条记录。总的记录数保持在1.2亿的数据量。
当需要新的空间来存储新的数据的时候,我们就通过交换表分区来快速删除一个分区的数据,并使用这个分区来存放新进库的数据。
如果每次都人工来执行交换分区的话就太麻烦了,所以我对这个如何进行交换分区删除数据来清理磁盘空间做成自动化。
在执行自动化的作业却也发现了很多问题,在分区文件达到40G的情况,执行交换分区的时间会很长(在正常进数据的情况下执行作业),而对8G的数据文件进行交换分区时速度非常快, 只能先禁用掉MSSQLSERVER网络协议中的TCP/IP的协议;重启SQLServer服务;执行Job进行交换分区;
Step1:SQL Server 合并(删除)分区解惑
Step2:SQL Server 2005 分区模板与实例
Step3:SQL Server 动态生成分区脚本
Step4:SQL Server 2005 自动化删除表分区设计方案
Step5:SQL Server 表分区注意事项
Step6:SQL Server 自动化管理分区设计方案(图解)
Step7:SQL Server 维护计划备份主分区
Step8:SQL Server 当表分区遇上唯一约束
Step10:SQL Server 解读【已分区索引的特殊指导原则】(1)- 索引对齐
Step11:SQL Server 解读【已分区索引的特殊指导原则】(2)- 唯一索引分区
Step12:SQL Server 解读【已分区索引的特殊指导原则】(3) - 非聚集索引分区
我会继续了解和深入表分区的一些知识,并继续写一些关于表分区实际应用的文章。但是一个人的能力和视野是比较有限,所以大家如果有更好的分区实战经验的话,欢迎拿出来分享和交流。看到一些好的博文也欢迎把地址贴出来。
SQL Server 性能优化实战系列(二)
标签:没有 交流 创建 童鞋 字符 产生 tool sql init