我在努力改善性能上查询的运行速度非常缓慢。后会通过 实际执行计划;我发现一个 集群寻求索引 正的82%。是否有任何办法,我提高的性能 索引寻求?下面是一个形象的问题 索引寻求 从执行计划》以及索引和表使用。

alt文本http://img340.imageshack.us/img340/1346/seek.png

指标:

/****** Object:  Index [IX_Stu]    Script Date: 12/28/2009 11:11:43 ******/
CREATE CLUSTERED INDEX [IX_Stu] ON [dbo].[stu] 
(
 [StuKey] ASC
)WITH (PAD_INDEX  = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]

表(省略了某些列为简洁起见):

CREATE TABLE [dbo].[stu](
 [StuCertKey] [int] IDENTITY(1,1) NOT NULL,
 [StuKey] [int] NULL
 CONSTRAINT [PK_Stu] PRIMARY KEY NONCLUSTERED 
(
 [StuCertKey] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]
有帮助吗?

解决方案

我推断这里,但是...

聚集指数追求的是,大部分,最好的情况。唯一的方式我能想要提高性能将是:

  • 更新的查询,以减少返回的行/列,如果可能的;
  • 整理或重建索引;
  • 分区指数在多个磁盘/服务器。

如果它只是返回的138行,它的缓慢...也许它是被阻止通过一些其他的过程吗?你的测试这个孤立的,或是其他用户/工艺的网上在同一时间?或者,也许这甚至是一个硬件的问题,像个磁盘故障。

其他提示

聚集索引旨在当使用非聚集索引并且不一定坏发生。

考虑以下查询:

SELECT s.StuKey, s.Name, s.Address, s.City, s.State FROM stu s WHERE State='TX'

如果仅存在上StuKey聚簇索引,那么SQL Server只有1个选项,则必须扫描整个表寻找行,其中状态=“TX”,并返回这些行。

如果您在国家添加非聚集索引

CREATE INDEX IX_Stu_State on Stu (State)

现在SQL Server有一个新的选择。它可以选择寻求使用非聚集索引,这将产生行,其中国家=“TX”。然而,为了获得其余的列在SELECT返回,它做一个聚集索引寻找每一行来查找那些列。

如果你想减少聚集索引查找,那么你可以通过在其额外列让你指数“覆盖”。

 CREATE INDEX IX_Stu_State2 on Stu (State) INCLUDE (name, address, city )

此指数现在包含回答上述查询所需的所有列。查询会做一个索引查找返回只在国家=“TX”,和其他列可以在非聚集索引的拉出行,因此聚集索引力求走。

聚集指标的范围内寻求返回的138行是不是你的问题。

从技术上讲,可以提高性能寻求通过使聚集的索引窄:

两者可以有一个相当巨大的影响范围内寻求时,作为它们减少IO和需要打物的读取。当然,作为通常,结果将同大量的其他因素,像什么列做你的项目(逐出预计列入BLOB分配单元实际上可能具有不利影响的某些查询)。作为一个侧面说明,通常为分裂只会有一个边际影响如此短的范围扫描。再次,它依赖。

但如我所说,我很怀疑这是你真正的问题。你只有公布的选定部分的计划和结果的你自己的分析。真正的根本原因可能在完全在其他地方。

思想...

  • 为什么是IX_Stu聚集?在内部,SQL服务器增加了4个字节的"唯一标识符"的非唯一集群的索引。是什么理由?这也膨胀你PK太

  • 什么是实际查询你都跑?

  • 最后,为什么填充因子的80%?

编辑:

  • "正常的"填充因子会是90%,但这是一条经验法则只

  • 11参加的查询?这是最可能的是你的问题。什么是您的加入,其中的条款,等等?什么是完整的文本的计划?

一些一般性的建议是:当我需要做的查询优化,我写了什么,我认为执行计划应该是开始。

在我决定什么,我认为执行计划应该是,我尽量让实际的查询适合这一计划。要做到这一点的技术是针对每个DBMS不同,并且不必从一转移到其他的,或甚至,有时,不同版本的DBMS之间。

要记住的一点是,DBMS只能执行一个连接在一个时间:它有两个初始表开始,加入这些,然后采取该操作的结果,并将其加入到下表中。在每一步的目标是最小化的行数在中间结果集(更正确地说,以尽量减少必须被读取,以产生中间结果的块的数量,但是这通常是指最少行)。

您是否尝试过在这个指数的一些保养?像碎片整理呢?看来真的是奇怪的是,它的成本太大(120.381)。指数追求的是速度最快的期指操作上,不应该花这么长时间。你能后的查询?

会发生什么,如果你硬编码您的 WHERE 的标准,这样的:

SELECT StuCertKey, StuKey FROM stu 
WHERE stuKey in (/* list 50 values of StuKey here */)

如果它仍然很慢,你有某种类型的内部问题。如果它的速度更快,那么股指是不是你的瓶颈,它的的JOIN 你正在做创建的 WHERE 过滤器。

请注意SELECT *可以是如果有许多大的列,并且尤其是如果有BLOB的速度很慢。

检查索引statictics。

重新计算群集索引的统计将解决这个问题。

在我的情况下,我一直在寻找在40M 30条记录条记录。 执行计划说,它会通过聚集索引,但它花了200ms左右。而指数没有碎片整理。重新计算它的统计后,它变得10ms的下完成!

重建索引,并计算统计信息?

,我能想到加快它的唯一的另一种方法是对表进行分区,这可能会或可能是不可能的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top