SQL Server 2000 - мой запрос выполняется медленно, внезапно - PullRequest
1 голос
/ 22 июня 2009

Мой запрос к базе данных выполнялся очень быстро, пока в последнее время он не стал очень медленным. В базе данных не произошло никаких изменений, кроме нормального роста данных.

Я заметил, что статистика базы данных "никогда" не обновлялась.

Есть ли простой способ обновить эти статистические данные по всей моей базе данных, чтобы узнать, в этом ли проблема?

Я использую SQL Server 2000 Sp4.

Ответы [ 5 ]

2 голосов
/ 22 июня 2009

Вы можете использовать это

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

Это обновит статистику по всем таблицам в БД. Вы также должны посмотреть на индексы и пересобрать / дефрагментировать как обязательные

Raj

0 голосов
/ 22 июня 2009

У нас была очень похожая проблема с MSSQL 2005 и неожиданно медленно выполняющиеся запросы.

Вот как мы решили это: мы добавили (nolock) для каждого оператора select в запросе. Например:

select count(*) from SalesHistory with(nolock)

Обратите внимание, что nolock также должен быть добавлен во вложенные операторы select и объединения. Вот статья, которая дает более подробную информацию о том, как увеличивается производительность при использовании nolock. http://www.mollerus.net/tom/blog/2008/03/using_mssqls_nolock_for_faster_queries.html

Не забудьте сохранить резервную копию исходного запроса, очевидно. Пожалуйста, попробуйте и дайте мне знать.

0 голосов
/ 22 июня 2009

Нормальный рост данных достаточно хорош как резонанс, чтобы оправдать замедление практически любого неоптимизированного запроса.

Проблемы масштабируемости, связанные с размером базы данных, не проявятся, пока объем данных не увеличится.

Опубликуйте свой запрос + приблизительный объем данных, и мы поможем вам увидеть, что к чему.

0 голосов
/ 22 июня 2009

Определенно создайте себе еженедельную задачу, которая будет запускаться автоматически для обновления статистики базы данных.

0 голосов
/ 22 июня 2009

Попробуйте здесь

Это должно ускорить ваши индексы и распределение ключей. Повторный анализ статистики таблиц оптимизирует выбор индекса SQL Server для запросов, особенно для больших наборов данных

...