在非唯一列上创建聚簇索引和/或分区?

时间:2011-08-31 14:17:40

标签: sql-server-2008 clustered-index database-partitioning

我有一个包含大约一千个Web服务器一周的日志条目的表。每个服务器每天向表中写入大约60,000个条目,因此每个服务器每周有420,000个条目。该表每周被截断。每个日志条目都包含servername,它是一个varchar(不能更改)。

主要操作是select * from table where servername = 'particular',以便检索服务器的420,000条记录,然后C#程序在选择后分析该服务器的数据。

我应该在servername列上创建聚簇索引以加快读取操作吗? (目前执行上述SQL语句需要半个多小时。)

分区会有帮助吗?计算机只有两个物理驱动器。

每周为每个服务器运行一次查询。在为所有服务器运行查询后,该表将被截断。

3 个答案:

答案 0 :(得分:2)

“标准”理想群集密钥类似于INT IDENTITY,它不断增加并且很窄。

但是,如果您对此表的主要用途是列出的查询,那么我认为servername上的聚簇索引是有意义的。如果表格很宽,您将看到速度大幅提升,因为您将从非聚集索引中消除在SELECT *上运行的昂贵的键/书签查找(除非您include中的所有字段表)。

修改

KM指出这会减慢插入速度,这是事实。对于此方案,您可能需要考虑servername, idfield上的idfield INT Identityservername的双字段密钥。这仍然只允许您在查询中使用{{1}}进行访问,但会在 PER SERVER 末尾插入新记录。你仍然会有碎片和重新排序。

答案 1 :(得分:2)

基于:

  

每周为每个服务器运行一次查询。运行查询后   对于所有服务器,该表将被截断。

  

大约一千个网络服务器

我将c#程序更改为只运行一次查询:

select * from table Order By servername,CreateDate

并让它在服务器名称更改时处理“中断”。

一次桌面扫描优于1,000次。我不会将主应用程序的INSERTS减慢到一个日志表(带有聚簇索引),这样你每周一次的查询运行得更快。

答案 2 :(得分:0)

是的,在clustered index列上创建servername是个好主意,因为现在数据库必须执行表扫描以找出哪些记录符合servername ='specific'的标准。< / p>

按日期水平partition表格可以进一步帮助推动事业。因此,数据库一次只需要担心所有服务器的一天数据。

然后确保启动基于日期的查询:

SELECT * FROM table
WHERE date BETWEEN '20110801' AND '20110808'
      AND servername = 'particular'