2011-03-04 50 views
2

我有生成快照數據庫,將其轉換爲XML,然後存儲一個單獨的數據庫中的XML的項目。不幸的是,這些快照變成了巨大的文件,現在每個大約10兆字節。幸運的是,我只有把它們存放一個月左右,他們可以再次但是仍然被丟棄之前,快照一個月轉出成爲真正的壞了它的性能...

我覺得這是提高性能很多辦法。不,不是將XML存儲在某個單獨的文件夾中,因爲我沒有對該服務器上任何位置的寫入權限。 XML必須保留在數據庫中。但不知何故,該領域[內容]可能會以某種方式進行優化,所以事情會加快......
我不需要在此字段上的任何全文搜索選項。我絕不會根據這個領域進行任何搜索。所以也許通過禁用這個領域的搜索指示或任何?

該表沒有對其他表的引用,但結構是固定的。我無法重命名或更改字段類型。所以我想知道優化是否仍然有可能。
恩,是嗎?


的結構,如SQL Server生成:優化的表與一個巨大的文本字段

CREATE TABLE [dbo].[Snapshots](
    [Identity] [int] IDENTITY(1,1) NOT NULL, 
    [Header] [varchar](64) NOT NULL, 
    [Machine] [varchar](64) NOT NULL, 
    [User] [varchar](64) NOT NULL, 
    [Timestamp] [datetime] NOT NULL, 
    [Comment] [text] NOT NULL, 
    [Content] [text] NOT NULL, 
CONSTRAINT [PK_SnapshotLog] 
    PRIMARY KEY CLUSTERED ([Identity] ASC) 
    WITH (PAD_INDEX = OFF, 
    STATISTICS_NORECOMPUTE = OFF, 
    IGNORE_DUP_KEY = OFF, 
    ALLOW_ROW_LOCKS = ON, 
    ALLOW_PAGE_LOCKS = ON, 
    FILLFACTOR = 90) ON [PRIMARY], 
CONSTRAINT [IX_SnapshotLog_Header] 
    UNIQUE NONCLUSTERED ([Header] ASC) 
    WITH (PAD_INDEX = OFF, 
    STATISTICS_NORECOMPUTE = OFF, 
    IGNORE_DUP_KEY = OFF, 
    ALLOW_ROW_LOCKS = ON, 
    ALLOW_PAGE_LOCKS = ON, 
    FILLFACTOR = 90) 
    ON [PRIMARY], 
CONSTRAINT [IX_SnapshotLog_Timestamp] 
    UNIQUE NONCLUSTERED ([Timestamp] ASC) 
    WITH (PAD_INDEX = OFF, 
    STATISTICS_NORECOMPUTE = OFF, 
    IGNORE_DUP_KEY = OFF, 
    ALLOW_ROW_LOCKS = ON, 
    ALLOW_PAGE_LOCKS = ON, 
    FILLFACTOR = 90) 
    ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 


性能不只是選擇從該表中的數據時,也減緩選擇或在此數據庫中的其它表的一個插入數據時!當我從這張表中刪除所有記錄時,整個系統很快。當我開始添加快照時,性能開始下降。大約30次快照後,性能變差,連接超時的風險增加。
也許問題不在於數據庫本身,儘管通過管理工具使用它仍然很慢。 (當快照爲空時快速)。我主要使用ASP.NET 3.5和Entity Framework連接到此數據庫,然後讀取多個表。也許有些性能可以在這裏獲得的,儘管這無法解釋爲什麼該數據庫還從管理工具慢,並通過與直接連接其他應用程序使用時...

+0

如果在數據庫結構中不允許更改,那麼只能在查詢時完成更改。即使沒有必要,您的查詢是否正在讀取[內容]字段? – Puneet 2011-03-04 11:38:51

+0

我仍然可以更改字段的選項,而不是字段名稱或類型。具有結構,我只是指名稱,索引和字段... – 2011-03-04 11:45:39

+1

當您從命令行直接執行數據庫操作時,您是否可以驗證性能是否較慢?通過ID選擇特定的記錄?我可以想到爲什麼只有30條記錄(即使是大數據)會導致SQL服務器的性能問題。文本數據不會與SQL Server中的記錄存儲在同一個頁面中,它對記錄訪問速度應該幾乎沒有影響或沒有影響。你的訪問方法(實體框架)很可能要求它不需要的東西,例如當不需要它時使用「SELECT *」或獲取它不需要的記錄。 – 2011-03-04 13:10:06

回答

0

整個系統變得快了很多,當我替換爲NVARCHAR(MAX)數據類型text數據類型。 HLGEM指出,TEXT數據類型已過時,因此很麻煩。儘管這些列的數據類型可以用更現代的數據類型替換,但這仍然是一個問題。 (翻譯:我需要測試,如果代碼改變了其數據類型工作...)
所以,如果我將改變從文本到NVARCHAR(MAX)數據類型,有什麼會破壞因爲這個?我可以期待的問題是什麼?
現在,這似乎解決了問題,但我需要做一些遊說,然後才允許進行此更改。所以我需要確保它不會導致任何(意外的)問題。

+1

查看寫入這些字段的代碼,特別查看您的代碼庫中的WRITETEXT和UPDATETEXT。您可能還會尋找READTEXT。 – HLGEM 2011-03-07 13:57:21

2

鑑於你限制,你可以嘗試荏苒的XML然後以二進制形式插入數據庫。這應該會顯着降低這些數據的存儲成本。

你提到這是不好的表現,多久你從這個快照表讀數?如果這只是存儲它應該只會影響寫作時的性能。如果您經常閱讀這篇文章,您是否確定性能問題與數據存儲不同,而不是解析10MB的XML?

+0

它更糟。它不從這個數據庫讀取數據很慢。當此快照表變大時,讀取此數據庫中的任何表格會變慢。 – 2011-03-04 12:41:12

3

該表位於PRIMARY文件組中。你能否將這個表移動到不同的文件組中,或者甚至是受到限制的?如果可以,您應該將其移動到具有自己的物理文件的其他文件組。這應該有很大的幫助。 Check out如何創建新的文件組並將對象移動到新的文件組。

+0

不幸的是,我無法將它移動到另一個文件組,儘管事實證明它有點改進。 – 2011-03-07 08:51:11

相關問題