2 Stimmen

Wie wählt man eine große Anzahl von Datensätzen in SQL SERVER aus?

Ich versuche, mehr als 80.000 Datensätze in SQL Server in einer Tabelle auszuwählen, die Millionen von Datensätzen enthält. Das Problem ist, dass ich den richtigen Index habe, aber es dauert mehr als 15 Minuten, um den Datensatz zurückzugeben.

Ich verwende MS SQL Server 2000. Ich habe eine Paginierungsmethode mit gespeicherten Prozeduren gefunden, aber sie verwendet eine temporäre Tabelle, in die ich die gesamte Ergebnismenge einfügen und dann die Anzahl der Datensätze auswählen muss, die ich pro Seite anzeigen möchte. Diese Methode dauert zu lange.

Gibt es einen schnelleren Weg, den ich einschlagen kann?

5voto

Charles Bretana Punkte 137391

Sie müssen dies bearbeiten, um Ihre Eingabeparameter für die Filter- und Sortieroptionen des Benutzers zu implementieren, aber das allgemeine Prinzip wird gelten. Ich habe diese Technik mit SQL 2000 im Zeitrahmen 2000/2001 mit einer Tabelle mit 90 Mio. Datensätzen verwendet, um ein schnelles Paging für Ergebnismengen mit 150-200k Zeilen zu erreichen. Da sich nur der Schlüssel in der temporären Tabelle befindet, handelt es sich um eine sehr schmale, sehr kleine temporäre Tabelle, und die Leistung ist schnell (und für diesen Schritt muss nur der Index der Haupttabelle gelesen werden, nicht die Tabelle selbst). Wenn dann tatsächlich Daten aus der Haupttabelle für die tatsächliche (kleinere) Ergebnismenge (nur @PageSize-Zeilen) generiert werden, muss die Abfrage nur wenige Datensätze lesen...

Create Procedure GetPagedData
@Page Integer = 1,
@PageSize Integer = 100,
@UsersFilteringCOnditions,
@UsersSortOptions
As
Set NoCount On

Declare @Start Integer,
Declare @End Integer
Declare @NumRecs Integer

   -- Declare a temp table variable to hold all the pk values...
   Declare @Keys Table (rowNum integer Identity Primary Key NotNull,
                        keyVal Integer Not Null)

   -- Insert all the Primary Keys into the temp table variable...
   Insert @keys(keyVal)
   Select PrimaryKey From MyMillionRowTable
   Where UsersFilterConditionsAreTrue
   Order By UsersSortOptions

  -- Then, select from your big table only the data 
  -- from the rows for the page the user wants

   Select @NumRecs = Count(*) From Keys 
   Set @End = @Page * @PageSize
   Set @Start = @End + 1 - @PageSize

   Select {Insert ColumnListHere}
   From MyMillionRowTable T
       Join @Keys K On K.KeyVal = T.PrimaryKey 
   Where K.rowNum Between @Start And @End

0voto

Jim Blizard Punkte 4256

Es gibt mehrere Möglichkeiten. Die üblichen DB-Tuning-Tricks (in denen ich kein Experte bin). Ist es möglich, die Teilmenge der Daten, die Sie interessieren, hinter den Kulissen in eine kleinere Tabelle zu extrahieren?

0voto

Valerion Punkte 813

Wird der Index auf jeden Fall verwendet? Handelt es sich um einen geclusterten Index? Überprüfen Sie den Ausführungsplan. Vielleicht möchten Sie auch den Index neu erstellen.

Andernfalls posten Sie die Abfrage sowie die Tabellendefinition und die Indizes.

Es könnte auch eine Einschränkung Ihrer SQL-Konfiguration (Menge des verwendeten RAM usw.) oder Ihrer Hardware sein. Handelt es sich um eine einzelne Festplatte oder ein RAID? Wenn es sich um ein RAID handelt, ist eines der Laufwerke ausgefallen und muss im Hintergrund wiederhergestellt werden?

0voto

Bill Punkte 1748

@jmpena: Entschuldigung, der Ausführungsplan benötigt 2% Lesen aus dem Lesezeichen und 98% Scannen des Index

Ich glaube, Sie haben Ihre eigene Frage beantwortet. "98% Scannen des Index". Einen Index zu scannen bedeutet nur, dass SQL einen Index gefunden hat, der puede Hilfeleistung auf der Grundlage von Statistiken ausgewählt. Je nach Index kann der Vorgang genauso schlecht sein wie ein Tabellenscan selbst.

Was Sie sehen sollten, wenn der Index/die Abfrage richtig eingestellt wäre, wäre eine Indexsuche.

Können Sie uns mitteilen, welche Indizes sich auf dem Tisch befinden? (sp_help {tablenname})

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X