访问我的一个表时,我需要一些重新分解咨询我遇到了巨大的进展缓慢。对不起,如果这不是这种事情的正确领域。大表建议(SQL Server)的
我工作的一个项目,旨在为我们的内部服务器的服务器性能统计报表。我每天晚上处理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行,它将继续增长。
我访问以产生报告和创建从ColdFusion的曲线图,像这样的数据:
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
和##
映射到#
)
我基本上创建临时表以便我可以使用rownumber来选择每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亿行的表格,而且我们仍然可以在不到一秒的时间内完成查询。正如你推断的那样,索引在这里非常重要。 – 2009-11-20 16:39:43
丹尼尔是正确的,我们的数据仓库建立在一个sql服务器平台上,我们经常在包含3.5亿行的表上报告(也很快)。 – 2009-11-20 16:43:10
我很高兴我不负责你的数据库,我不知道从哪里开始!有趣的是,我在大学学习了数据库设计,作为我的CS课程的一部分,但他们甚至没有涉及索引或任何类型的实际数据维护,真的令人失望。 – OrganicPanda 2009-11-23 10:00:54