Sql server 2008 是否在非唯一列上创建聚集索引和/或分区?

Sql server 2008 是否在非唯一列上创建聚集索引和/或分区?,sql-server-2008,clustered-index,database-partitioning,Sql Server 2008,Clustered Index,Database Partitioning,我有一个表,其中包含一周内大约一千个web服务器的日志条目。每台服务器每天向表中写入大约60000个条目,因此每台服务器每周有420000个条目。该表每周截断一次。每个日志条目都包含servername,它是一个不能更改的varchar 主要操作是从servername='Special'的表中选择*以检索服务器的420000条记录,然后C程序在选择后分析来自该服务器的数据 我是否应该在servername列上创建聚集索引以加快读取操作?目前执行上述SQL语句需要半个多小时 分区有帮助吗?计算机

我有一个表,其中包含一周内大约一千个web服务器的日志条目。每台服务器每天向表中写入大约60000个条目,因此每台服务器每周有420000个条目。该表每周截断一次。每个日志条目都包含servername,它是一个不能更改的varchar

主要操作是从servername='Special'的表中选择*以检索服务器的420000条记录,然后C程序在选择后分析来自该服务器的数据

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


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


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

标准的理想集群键类似于一个不断增加且很窄的INT标识

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

编辑:


KM指出这会减慢插入速度,这是事实。对于这个场景,您可能想在ServNeX、IDfield中考虑两个字段密钥,其中IDfield是int标识。这仍然允许仅基于查询中的servername进行访问,但会在每台服务器的末尾插入新记录。您仍将有碎片和重新排序。

是的,在servername列上创建聚集索引是一个好主意,因为现在数据库必须进行表扫描,以找出哪些记录满足servername='Special'的条件

此外,按日期水平划分表将有助于进一步分析原因。因此,数据库有时只需要担心所有服务器一天的数据

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

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

每个服务器每周运行一次查询。在查询运行之后 对于所有服务器,表都被截断

大约一千台网络服务器

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

select * from table Order By servername,CreateDate
并使其在服务器名称更改时处理中断


一次扫描表优于1000次扫描。我不会减慢主应用程序插入带有聚集索引的日志表的速度,这样每周查询一次的速度就会更快。

计算机只有两个物理驱动器。-在做其他事情之前,先整理一下真正的硬件!对于RAID 10中的TLOG,物理时间至少为4分钟;对于RAID 10中的数据,物理时间至少为4分钟,因为高写入和readshow通常每周运行此查询吗?但是,此表上的聚集索引将减慢插入速度,因为将有大量无序写入的行。没有免费午餐。如果我仅在servername上创建聚集索引,它不会在每台服务器的末尾插入新记录吗?@John-可能,但不能保证。