我有一个包含大约一千个Web服务器一周的日志条目的表。每个服务器每天向表中写入大约60,000个条目,因此每个服务器每周有420,000个条目。该表每周被截断。每个日志条目都包含servername,它是一个varchar(不能更改)。
主要操作是select * from table where servername = 'particular'
,以便检索服务器的420,000条记录,然后C#程序在选择后分析该服务器的数据。
我应该在servername列上创建聚簇索引以加快读取操作吗? (目前执行上述SQL语句需要半个多小时。)
分区会有帮助吗?计算机只有两个物理驱动器。
每周为每个服务器运行一次查询。在为所有服务器运行查询后,该表将被截断。
答案 0 :(得分:2)
“标准”理想群集密钥类似于INT IDENTITY
,它不断增加并且很窄。
但是,如果您对此表的主要用途是列出的查询,那么我认为servername
上的聚簇索引是有意义的。如果表格很宽,您将看到速度大幅提升,因为您将从非聚集索引中消除在SELECT *
上运行的昂贵的键/书签查找(除非您include
中的所有字段表)。
修改强>
KM指出这会减慢插入速度,这是事实。对于此方案,您可能需要考虑servername, idfield
上的idfield
INT Identity
为servername
的双字段密钥。这仍然只允许您在查询中使用{{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'