2009-03-10 10 views
3

Ich habe eine Tabelle, die rund 400 000 Datensätze enthält und die auf der Homepage der Intranet-Website aufgerufen wird. In Spitzenzeiten können wir 300-400 gleichzeitige Benutzer haben. Das SQL Profiler-Tool gibt die folgende Ausgabe.Verbesserung der SQL Server Abfrage Antwortzeit

  • CPU: 406
  • Liest: 32446
  • Dauer: 397

ich die Felder in der 'wo' Klausel beteiligt indiziert. Gibt es eine Möglichkeit, die Reaktionszeit noch zu verbessern?

Was ist zu tun, um die Festplattenlesevorgänge zu reduzieren?

Serverkonfiguration: Windows 2003 64 Bit, SQL Server 2005 64 Bit SP2, .NET 2.0.

Die Abfrage- und Tabellendefinition wurde unten hinzugefügt. Es gibt noch 40 weitere Felder, die ich hier der Einfachheit halber nicht hinzugefügt habe. Die Felder, die meistens varchar sind, werden in der where-Klausel nicht verwendet. Sie sind nur da, um auf der Seite angezeigt zu werden. Es gibt einige Felder (5-6), die momentan nicht verwendet werden, aber ich habe sie in der Abfrage gelassen, weil sie später benötigt werden. Soll ich sie jetzt ausziehen? Würde das die Reaktionszeit verbessern?

Abfrage

SELECT 
    u.[PeopleKey], 
    u.[EnterpriseId], 
    u.[PersonnelNbr], 
    u.LastName, 
    u.FirstName, 
    u.MiddleName,  
    cc.WorkForceCd AS CareerCounselorWorkForceCd,      
    cc.WorkForceDesc AS CareerCounselorWorkForceDesc,      
    cc.WorkGroupCd AS CareerCounselorWorkGroupCd,     
    cc.WorkGroupDesc AS CareerCounselorWorkGroupDesc,     
    cc.CareerLevelCd As CareerCounselorCareerLevelCd,    
    cc.CareerLevelDesc AS CareerCounselorCareerLevel,    
    CL.NextLevelCD as nextCareerLevelCd 
FROM 
    [User] u 
    LEFT JOIN [User] cc ON 
     u.[CareerCounselorPeopleKey] = cc.PersonnelNbr 
    Left JOIN [CareerLevel] CLON 
     u.WorkForceCd= CL.WorkForceCd AND 
     u.CareerLevelCd = CL.LevelCd 
WHERE 
    u.PeopleKey = <integer> 

[CareerLevel]

ID int 4 [Primary Key - clustered index] 
Description varchar 150 
WorkforceCd varchar 4 
LevelCD varchar  10 
NextLevelCD varchar 10 

[Benutzer]

PeopleKey int 4 [Primary Key - clustered index] 
EnterpriseId varchar 50 [non clustered index] 
PersonnelNbr varchar 8 [non clustered index] 
FirstName varchar 40 
LastName varchar 40 
MiddleName varchar 40 
CareerCounselorPeopleKey int 4 
CareerCounselorPersonnelNbr varchar 8 
CareerCounselorName varchar 50 
CapabilityCd varchar 5 
CapabilityDesc varchar 25 
WorkforceCd varchar 4 
WorkForceDesc varchar 40 
WorkGroupCd varchar 4 
WorkGroupDesc varchar 50 
CareerLevelCd varchar 10 
CareerLevelDesc varchar 50 
+0

indiziert werden schreiben Sie Ihre Tabellendefinition und die SQL-Abfrage –

+0

vereinbart, dass sehr hilfreich wäre. –

+0

wow :) danke Jungs, Ihre Antworten selbst haben mir viel zu denken gegeben. Ich werde die Tabellendefinition und die Abfrage innerhalb der nächsten paar Minuten veröffentlichen. – user20358

Antwort

1

Können Sie das Tabellenschema und die Indexdefinitionen veröffentlichen? Wie sehen deine Anfragen aus? Die Anzahl der Lesevorgänge würde auf massive E/A-Vorgänge hindeuten - also vielleicht aufgrund Ihrer Tabellen- und Indexeinstellungen und/oder der Art der Abfrage, obwohl Sie Indizes haben, werden sie nicht verwendet.

Führen Sie regelmäßig Wartungspläne für die Datenbank aus? Z.B. Werden Ihre Indizes reorganisiert und/oder neu aufgebaut, wenn die Indexfragmentierung zu hoch wird?

Sie könnten immer den Database Tuning Advisor von SQL verwenden, um Hinweise zu erhalten, wie Sie bestimmte Abfragen optimieren können - oder besser noch, einige Nutzungsdaten mithilfe einer SQL-Ablaufverfolgung sammeln und für potenzielle Optimierungsschritte analysieren.

Marc

0

Wie groß ist Ihr DB und wie viel RAM hast du auf der Box?

Sie erwähnen Indizes für die Felder, die in der where-Klausel enthalten sind ... sind Ihre Indexspalten in der gleichen Reihenfolge wie Ihre where-Klauselspalten?

Wenn Sie den Abfrageausführungsplan in Sql Management Studio ausführen, sehen Sie Tabellensuchen (Suchvorgänge). Wenn Sie Scans sehen, fehlen Ihnen möglicherweise Indizes.

Was ist Ihr Primärschlüssel/Clustered-Index? Können Sie Ihre Lookups auf den Clustered Index umstellen? Dies ist immer Ihre schnellste Route zu Ihren Daten.

Hoffe, dass hilft!

+0

Hallo Ian, danke für die Antwort :) "Index Spalten in der gleichen Reihenfolge wie Ihre Where-Klausel Spalten" Wie wirkt sich das aus? – user20358

0

Werfen Sie einen Blick auf die SQL Server Performance Dashboard. Wenn Sie offensichtliche Probleme haben, werden sie dort auftauchen.

Sie sollten auch nicht einfach Indizes hinzufügen, ohne den Ausführungsplan der Abfragen zu analysieren (und zu sehen, wonach sie suchen).

+0

Danke, ich war mir nicht bewusst, dass dieses Tool vorhanden ist, werde es mir auf jeden Fall ansehen. –

0

Beitreten - Alle diese Spalten: ON und [CareerCounselorPeopleKey] = cc.PersonnelNbr Left JOIN [CareerLevel] CL ON u. WorkForceCd = CL. WorkForceCd UND u. CareerLevelCd = CL. LevelCd

Wie Ihre WHERE-Klausel war die ON-Klausel für offensichtliche Schlüsselrelationen!

So sind die Fett markierten Spalten müssen auch ...