2

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

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

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

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

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

4

3 回答 3

2

“标准”理想的聚集键类似于INT IDENTITY不断增加且变窄的键。

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

编辑:

KM 指出这会减慢插入速度,这是事实。servername, idfield对于这种情况,您可能需要考虑在where idfieldis an上使用双字段键INT Identity。这仍然允许仅基于您的查询进行访问,但会在PER SERVERservername末尾插入新记录。您仍然会有碎片和重新排序。

于 2011-08-31T14:25:09.463 回答
2

基于:

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

大约一千个网络服务器

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

select * from table Order By servername,CreateDate

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

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

于 2011-08-31T15:00:14.730 回答
0

clustered index是的,创建一个on列是个好主意,servername因为现在数据库必须进行表扫描以找出哪些记录满足 servername = 'particular' 的条件。

此外partition,按日期水平排列的表格将进一步帮助该事业。因此,数据库一次只需要担心所有服务器的一天数据。

然后确保触发基于日期的查询:

SELECT * FROM table
WHERE date BETWEEN '20110801' AND '20110808'
      AND servername = 'particular'
于 2011-08-31T14:31:37.583 回答