2009-06-21 6 views
1

Meine Datenbankabfrage wurde sehr schnell ausgeführt, bis sie vor kurzem sehr langsam geändert wurde. In der Datenbank sind abgesehen von normalem Datenwachstum keine Änderungen aufgetreten.SQL Server 2000 - Meine Abfrage läuft langsam, ganz plötzlich

Ich habe festgestellt, dass die Datenbankstatistik "nie" aktualisiert wurde.

Gibt es eine einfache Möglichkeit, diese Statistiken über meine gesamte Datenbank zu aktualisieren, damit ich sehen kann, ob das das Problem ist?

Ich verwende SQL Server 2000 Sp4.

+0

Es scheint kein Sperrproblem zu sein, da das Timing konsistent ist, selbst wenn die Datenbank nicht unter Datenbanklast steht. – GordyII

+0

Haben Sie versucht, die Abfrage zu ändern und (nolock) hinzuzufügen? Oder Sie gehen davon aus, dass sich das nicht ändert. –

+0

Ich ersetzte einen der Indizes durch einen geeigneteren. Es läuft alles schnell, nur unsicher, warum sich der Indexplan/die Geschwindigkeit ändern würde. Ich habe keine No-Lock-Klausel hinzugefügt. – GordyII

Antwort

2

können Sie diese

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 

verwenden Dies wird Statistiken für alle Tabellen in der DB aktualisieren. Sie sollten auch bei Indizes suchen und wieder aufbauen/defrag als nexessary

Raj

0

Versuchen here

Dies sollte Ihre Indizes und Schlüsselverteilung beschleunigen. Das erneute Analysieren von Tabellenstatistiken optimiert die SQL Server-Auswahl des Index für Abfragen, insbesondere für große Datenmengen

0

Erstellen Sie auf jeden Fall eine wöchentliche Aufgabe, die automatisch ausgeführt wird, um die Statistik der Datenbank zu aktualisieren.

0

Normale Datenwachstum ist gut genug, um als reson jede nicht optimierte Abfrage eine Verlangsamung der ziemlich viel zu rechtfertigen.

Skalierbarkeitsprobleme im Zusammenhang mit der db-Größe treten erst auf, wenn das Datenvolumen wächst.

Veröffentlichen Sie Ihre Anfrage + Grobdatenvolumen und wir helfen Ihnen zu sehen, was was ist.

-1

Wir hatten ein sehr ähnliches Problem mit MSSQL 2005 und plötzlich langsam laufenden Abfragen.

So haben wir es gelöst: Wir haben (nolock) für jede select-Anweisung in der Abfrage hinzugefügt. Beispiel:

select count(*) from SalesHistory with(nolock) 

Beachten Sie, dass nolock auch verschachtelten Select-Anweisungen sowie Joins hinzugefügt werden sollte. In diesem Artikel erfahren Sie mehr darüber, wie die Leistung bei Verwendung von nolock erhöht wird. http://www.mollerus.net/tom/blog/2008/03/using_mssqls_nolock_for_faster_queries.html

Vergessen Sie nicht, eine Sicherungskopie Ihrer ursprünglichen Abfrage offensichtlich zu behalten. Bitte versuchen Sie es und lassen Sie es mich wissen.

+1

Sie müssen hinzufügen (NOLOCK) zu jeder und evry-Tabelle in Ihren von und Join-Anweisungen und Sie riskieren schmutzige Lesevorgänge. Wenn Sie mit Dirty Reads zufrieden sind, sollten Sie stattdessen READ UNCOMMITTED versuchen. – Raj

+0

Das ist richtig, wenn Ihre Webanwendung Transaktionen stark nutzt, haben Sie möglicherweise etwas veraltete Daten für einige Zellen (wenn Sie auswählen, bevor die Transaktion festgeschrieben wird, usw.)).In unserem Fall war das kein Problem und die Beschleunigung war am wichtigsten. Ich möchte auch anmerken, dass wir aufgrund der Verwendung von (nolock) niemals große Deskrepanzen hatten. –

+0

Downvoter? Bitte erkläre. –