Sql server 2008 在SQL Server 2008上重建索引后没有实际的性能提升
我有一个表,它的复合聚集索引(Sql server 2008 在SQL Server 2008上重建索引后没有实际的性能提升,sql-server-2008,indexing,clustered-index,Sql Server 2008,Indexing,Clustered Index,我有一个表,它的复合聚集索引(int,DateTime)是99%分段的 在进行碎片整理并确保更新了统计信息后,我在运行此查询时仍然得到相同的响应时间: SELECT * FROM myTable WHERE myIntField = 1000 AND myDateTimeField >= '2012-01-01' and myDateTimeField <= '2012-12-31 23:59:59.999' 选择* 从myTable 其中myIntField=1000 而my
int,DateTime
)是99%分段的
在进行碎片整理并确保更新了统计信息后,我在运行此查询时仍然得到相同的响应时间:
SELECT *
FROM myTable
WHERE myIntField = 1000
AND myDateTimeField >= '2012-01-01'
and myDateTimeField <= '2012-12-31 23:59:59.999'
选择*
从myTable
其中myIntField=1000
而myDateTimeField>='2012-01-01'
和myDateTimeField您应该避免选择*
——即使您确实需要表中的所有列(这很少见)
而且,你在这里做的事情非常危险。您是否知道您的最终范围已到,因此您可能会在午夜时包含2013-01-01的数据?尝试:
AND myDateTimeColumn >= '20120101'
AND myDateTimeColumn < '20130101'
和myDateTimeColumn>='20120101'
和myDateTimeColumn<'20130101'
(这不会改变性能,但无论基础数据类型是什么,它都更容易生成并保证准确。)
为了从查询时间的分析中消除网络延迟,您可以考虑——允许您通过向服务器运行查询来生成实际计划,但是放弃结果,因此这不是干扰因素。
免责声明:我为SQL Sentry工作。查询的执行时间将花费在读取足够多的索引btree页面以生成结果上。对索引进行碎片整理将把相邻的行放在一起,从而减少需要读取的页数。它还可以从将很大程度上随机的io模式转换为连续的io模式中获益
如果您的行很宽,并且每页的行数不多,那么您将不会看到行数的减少
如果索引填充因子较低,则每页的行数就不会那么多
如果您的页面在缓存中,您将看不到任何streaming v random IO的好处
如果计算机上有空闲的CPU容量,则使用页面压缩可能会使您受益。这实质上是用更多的CPU换取更少的IO。表中有多少行,而与此查询匹配的行有多少行?这张桌子有多宽?需要多长时间?你在哪里测量这个(ManagementStudio,你的应用程序)以及你检索结果离数据源有多远?你看过统计数据了吗?这个场景可能完全在记忆中,有助于解释你在这里看到的东西。到底是什么问题?返回多少行?查询需要多长时间?当您进行查询时,请将日期字符串文本更改为“安全”ISO-8601格式-YYYYMMDD
,不带任何破折号或斜杠或任何东西@Aaron Bertrand我放的代码只是一个示例,请不要介意select的编写方式,它不会影响我正在寻找的性能。