TechEd 2009 SQL Server动手实验答疑

TechEd2009上的SQL Server动手实验得到了广大学员的欢迎,不但积极与讲师们互动,还提出了许多高质量问题。在这篇博文中,我们总结了一些代表性的问题与大家共享。

问:SQL分区的最佳实践是什么?微软建议一个SQL Server上有多少个分区最佳?是10-100么?每个分区的最佳的大小是多少?
答:尽管分区表最多可以分成1000个分区(详见https://msdn.microsoft.com/en-us/library/ms143432.aspx),但数据库的性能和空间达到最佳优化的时候,应该是某一个平衡点,因为分区过少或过多都会有额外的开销。建议是根据具体条件,首先建立一个基准配置环境和基准性能尺度作为参考,然后逐步改变分区数和/或分区大小,分析变化,然后逐步找到最佳点。

问:在SQL Server 2005/2008上,当一个存储过程执行返回千万行的时候,SQL Server会占到16G的内存。有没有一个方法能让SQL Server自动的释放内存?
答:SQL Server能够很好的管理和使用所分配的内存。需要更多可用内存时,SQL Server会自动根据最旧最少使用的算法分配一些内存。当系统内存不足时,SQL Server也会自动释放一些内存。不建议使用DBCC FREESYSTEMCACHE或DBCC DROPCLEANBUFFERS等命令释放内存,这样会严重损坏系统的总体性能。

问:在SQL 2005上,对一个视图做了一个索引,但是当查询表的时候,在执行计划中,查看到那个视图的索引被采用了,这是怎么回事?
答:SQL Server查询优化器会根据索引和统计自动选择最佳的查询执行计划。

问:有一个网站每天有大量的日志,大约每天3G。用户希望把这些日志数据保存到SQL数据库中然后进行分析,SQL server有相关的解决方案么? 听说MySQL有类似的方案 :-)
答:可以使用SQL Server对网络日志进行分析。建议是按照日志格式建立表,然后BULK INSERT日志到表中,然后可以用SQL Server Analysis Service进行数据分析。详细步骤请参考https://support.microsoft.com/kb/296085

问:有没有一个方法把一个表的数据存放在一个指定的数据文件中?用户的场景是这样的:有一个数据量很大的表,用户希望将经常查询的数据放在一个高速磁盘上,将很少查询的数据放在一个低速的磁盘上。注意,随着时间的推移,常用的数据会变成不常用的数据,但是,SQL Server表的分区只支持在同一个分区内进行切换(SWITCH),而且,在一个分区中,无法指定将数据放到哪一个文件中,当一部分常用数据变成不常用数据时,如何将这部分新的不常用数据移到低速磁盘上?
答:SQL Server的表是基于文件组进行管理的。建议的解决方案有以下两种。第一,可以先创建一个文件组,然后在那个慢速磁盘上创建一个文件并归到这个文件组,然后用create table on filegroup 的语法方式创建表,最后将数据从表中迁移过来。第二,以2007年、2008年和2009年数据为例,可以先创建一个文件组FileGroupA,然后在那个慢速磁盘上创建一个文件并归到这个文件组FileGroupA,然后在这个文件上建表和分区PartitionA,如图1;然后SPLIT分区,从V1到V1+V2,将数据2008、2009分开为FileGroupB和FileGroupC上的分区PartitionB和PartitionC,如图2;最后合并MERGE分区PartitionB到PartitionA,如图3。

问:分析服务的备份和恢复时,选择文件路径的窗口没有 [浏览 … ] 功能,只支持用户手动输入。
答:这个问题已反馈给产品组。

曾屹 林默