【发布时间】:2009-11-20 15:41:50
【问题描述】:
我在访问我的一张表时遇到了极大的缓慢,我需要一些重构建议。抱歉,如果这不是此类事情的正确区域。
我正在开展一个项目,旨在报告我们内部服务器的服务器性能统计信息。我每晚都在处理 Windows 性能日志(12 个服务器,10 个性能计数器,每 15 秒记录一次)。我将数据存储在一个表中,如下所示:
CREATE TABLE [dbo].[log](
[id] [int] IDENTITY(1,1) NOT NULL,
[logfile_id] [int] NOT NULL,
[test_id] [int] NOT NULL,
[timestamp] [datetime] NOT NULL,
[value] [float] NOT NULL,
CONSTRAINT [PK_log] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH FILLFACTOR = 90 ON [PRIMARY]
) ON [PRIMARY]
目前有 16,529,131 行,并将继续增长。
我访问数据以生成报告并从冷融合创建图表,如下所示:
SET NOCOUNT ON
CREATE TABLE ##RowNumber ( RowNumber int IDENTITY (1, 1), log_id char(9) )
INSERT ##RowNumber (log_id)
SELECT l.id
FROM log l, logfile lf
WHERE lf.server_id = #arguments.server_id#
and l.test_id = #arguments.test_id#"
and l.timestamp >= #arguments.report_from#
and l.timestamp < #arguments.report_to#
and l.logfile_id = lf.id
order by l.timestamp asc
select rn.RowNumber, l.value, l.timestamp
from log l, logfile lf, ##RowNumber rn
where lf.server_id = #arguments.server_id#
and l.test_id = #arguments.test_id#
and l.logfile_id = lf.id
and rn.log_id = l.id
and ((rn.rownumber % #modu# = 0) or (rn.rownumber = 1))
order by l.timestamp asc
DROP TABLE ##RowNumber
SET NOCOUNT OFF
(对于非 CF 开发人员 #value# 插入 value 和 ## 映射到 #)
我基本上创建了一个临时表,以便我可以使用行号来选择每 x 行。这样,我只选择可以显示的行数。这有帮助,但仍然很慢。
SQL Server Management Studio 告诉我我的索引如下(我几乎不知道如何正确使用索引):
IX_logfile_id (Non-Unique, Non-Clustered)
IX_test_id (Non-Unique, Non-Clustered)
IX_timestamp (Non-Unique, Non-Clustered)
PK_log (Clustered)
我将非常感谢任何可以提供一些建议以帮助我加快速度的人。我不介意重新组织事物,并且我可以完全控制项目(尽管可能不是通过服务器硬件)。
干杯(对不起,很长的帖子)
【问题讨论】:
-
顺便说一句,1600 万行虽然很大,但绝非不可能。我们这里有一个 SQL Server 数据库,其中有一个包含大约 10 亿行的表,我们仍然可以在不到一秒的时间内执行查询。正如您所推断的,索引在这里非常重要。
-
Daniel 是对的,我们的数据仓库是建立在 sql server 平台上的,我们定期报告(而且速度也很快)超过 3.5 亿行的表。
-
我很高兴我不负责您的数据库,我不知道从哪里开始!有趣的是,我在大学学习数据库设计作为我的 CS 课程的一部分,但他们甚至没有涉及索引或任何类型的真实数据维护,真的有点令人失望。
标签: sql-server coldfusion sql-server-2000