訪問我的一個表時,我需要一些重新分解諮詢我遇到了巨大的進展緩慢。對不起,如果這不是這種事情的正確領域。大表建議(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