2009-06-21 91 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

不要忘记明显保留原始查询的备份。请尝试一下,让我知道。