2009-06-21 101 views
1

我的數據庫查詢運行速度非常快,直到最近變爲非常慢。除正常的數據增長外,數據庫中沒有發生任何變化。SQL Server 2000 - 我的查詢運行緩慢,突然間全部

我注意到數據庫統計信息「從來沒有」被更新過。

是否有一種簡單的方法可以在整個數據庫中更新這些統計信息,以便我可以看到這是否是問題所在?

我正在使用SQL Server 2000 Sp4。

+0

它看起來不是鎖定問題,因爲即使數據庫不在數據庫加載時,時序也是一致的。 – GordyII 2009-06-21 23:16:25

+0

您是否嘗試修改查詢並添加(nolock)?或者你只是假設它不會改變。 – 2009-06-21 23:43:08

回答

2

您可以使用此

CREATE PROC usp_UPDATE_STATISTICS 
(@dbName sysname, @sample int) 
AS 

SET NOCOUNT ON 

DECLARE @SQL nvarchar(4000) 
DECLARE @ID int 
DECLARE @TableName sysname 
DECLARE @RowCnt int 

CREATE TABLE ##Tables 
(
TableID INT IDENTITY(1, 1) NOT NULL, 
TableName SYSNAME NOT NULL 
) 

SET @SQL = '' 
SET @SQL = @SQL + 'INSERT INTO ##Tables (TableName) ' 
SET @SQL = @SQL + 'SELECT [name] ' 
SET @SQL = @SQL + 'FROM ' + @dbName + '.dbo.sysobjects ' 
SET @SQL = @SQL + 'WHERE xtype = ''U'' AND [name] <> ''dtproperties''' 

EXEC sp_executesql @statement = @SQL 

SELECT TOP 1 @ID = TableID, @TableName = TableName 
FROM ##Tables 
ORDER BY TableID 

SET @RowCnt = @@ROWCOUNT 

WHILE @RowCnt <> 0 
BEGIN 

SET @SQL = 'UPDATE STATISTICS ' + @dbname + '.dbo.[' + @TableName + '] WITH SAMPLE ' + CONVERT(varchar(3), @sample) + ' PERCENT' 

EXEC sp_executesql @statement = @SQL 

SELECT TOP 1 @ID = TableID, @TableName = TableName 
FROM ##Tables 
WHERE TableID > @ID 
ORDER BY TableID 

SET @RowCnt = @@ROWCOUNT 

END 

DROP TABLE ##Tables 


GO 

這將在數據庫中的所有表更新的統計數據。你也應該看看索引重建/碎片整理作爲nexessary

拉吉

0

嘗試here

這應該加快您的索引和密鑰分發。重新分析表統計信息優化了SQL Server對查詢索引的選擇,特別是對於大型數據集的索引

0

絕對讓自己成爲一個自動運行的每週任務來更新數據庫的統計信息。

0

正常數據增長是作爲振振有辭足夠好辯解幾乎任何未優化查詢的放緩。

相關數據庫大小的可伸縮性問題直到數據量增長才會顯示。

發佈您的查詢+粗略的數據音量,我們會幫助你查看是什麼。

-1

我們遇到了一個與MSSQL 2005非常類似的問題,並突然減慢運行查詢速度。

下面是我們解決它的方法:我們爲查詢中的每個select語句添加了(nolock)。例如:

select count(*) from SalesHistory with(nolock) 

請注意,nolock還應該添加到嵌套select語句以及連接。以下是一篇文章,詳細介紹了使用nolock時性能如何提高。 http://www.mollerus.net/tom/blog/2008/03/using_mssqls_nolock_for_faster_queries.html

不要忘記明顯保留原始查詢的備份。請嘗試一下,讓我知道。