2009-07-19 13 views
4

Ich verwende VSTS 2008 + C# +. Net 3.0 + ADO.Net + SQL Server 2008. Und von ADO.Net ich eine gespeicherte Prozedur von SQL Server-Seite aufrufen. Die gespeicherte Prozedur ist wie diese,wie effizient Tausende von Zeilen aus einer gespeicherten Prozedur abrufen

SELECT Table1.col2 
FROM Table1 
LEFT JOIN Table2 USING (col1) 
WHERE Table2.col1 IS NULL 

Meine Frage ist, wie die zurückgegebenen Zeilen (Table1.col2 in meiner Probe) effizient abzurufen? Mein Ergebnis kann bis zu 5.000 Zeilen zurückgeben und der Datentyp für Table1.col2 ist nvarchar (4000).

Vielen Dank im Voraus, George

+2

Sie verwenden SQL Server 2008 mit dieser Syntax? – gbn

+0

Mein Pseudocode, was ist das Problem? – George2

+2

Kein Problem, aber Es würde Leute verwirren, weil dies eine gültige Syntax für andere Datenbank-Engines ist. – gbn

Antwort

7

Sie NICHT - Sie können effizient nie abrufen, dass viele Daten ....

Der springende Punkt die Daten, die Sie abrufen zu begrenzen, effizient zu sein, ist - nur die Spalten, die Sie wirklich brauchen (keine SELECT *, sondern SELECT (Liste von Feldern), die Sie bereits tun), und nur so viele Zeilen, wie Sie leicht verarbeiten können.

Sie möchten beispielsweise kein Dropdown- oder Listenfeld ausfüllen, in dem der Benutzer einen einzelnen Wert mit Tausenden von Einträgen auswählen muss - das ist einfach nicht machbar.

Also ich denke, mein Punkt ist wirklich: Wenn Sie wirklich, wirklich 5000 Zeilen oder mehr zurückgeben müssen, wird es nur seine Zeit dauern. Es gibt nicht viel, was Sie dagegen tun können (wenn Sie 5000 Zeilen mit 5000 Bytes pro Zeile übertragen, das sind 25'000'000 Bytes oder 25 Megabytes - keine Magie, machen Sie das schnell).

Es wird nur sehr schnell gehen, wenn Sie eine Möglichkeit finden, die Anzahl der zurückgegebenen Zeilen auf 10, 20, 50 oder so zu begrenzen. Denken Sie an: Server-seitiges Paging !! :-)

Marc

+0

Danke Marc, gibt es irgendwelche Leistungsunterschiede, wie wir die Daten von ADO.Net Client-Seite manipulieren? Ich muss die zurückgegebenen Daten nur einmal nacheinander lesen. Was ist die Lösung, die Sie mir vorschlagen, Daten von ADO.Net Clientseite abzurufen? – George2

+1

Wenn Sie diese 5000 Zeilen abrufen müssen, ist der SqlDataReader definitiv der schnellste und beste Weg - greifen Sie die benötigten Spalten und speichern Sie sie in einer Liste oder so. –

4

Sie sagen nicht, was Sie mit den Daten tun mögen. Wenn Sie jedoch davon ausgehen, dass Sie die Ergebnisse in .NET verarbeiten müssen, ist das Lesen der Ergebnisse mit einer SqlDataReader der effizienteste Weg.

+0

Ich muss die zurückgegebenen Daten nur einmal nacheinander lesen. Was ist die Lösung, die Sie mir vorschlagen, Daten von ADO.Net Clientseite abzurufen? – George2

+3

Es hängt davon ab, was Ihr Hauptanliegen ist - Speichern oder halten Sie eine Verbindung zur Datenbank offen für eine lange Zeit.Wenn Sie Speicher sparen möchten, lesen Sie Zeile für Zeile mit dem SqlDataReader, verarbeiten Sie sie und fahren Sie dann mit der nächsten fort. Wenn Speicher jedoch keine große Rolle spielt, führen Sie die oben beschriebenen Schritte durch und verwenden Sie dann den SqlDataReader, um eine Liste zu erstellen, wobei T eine Klasse ist, die Ihre Spalten enthält. Lies alles in die Liste und arbeite danach damit. Siehe http://www.devx.com/vb2themax/Article/19887/1954 –

2

Ich würde für einen existiert.

SELECT 
    Table1.col2 
FROM 
    Table1 
WHERE 
    NOT EXISTS (SELECT * 
     FROM 
      Table2 
     WHERE 
      Table2.col1 = Table1.col1) 

Die Abfrage kann effizient sein (unter der Annahme col1 indiziert ist, sondern deckt cols (sehr breiten Index natürlich), aber Sie haben noch eine Menge von Daten über das Netzwerk schaufeln.

hängt es, was Sie 5000 Zeilen ist nicht viel für einen Bericht, aber es ist eine Menge für ein Kombinationsfeld

Verwandte Themen