Wie viele Parameter für gespeicherte Prozeduren sind zu viele?

12

Ich habe gerade angefangen, eine gespeicherte Prozedur in SQL Server 2008 zu schreiben und habe mehr als 30 Parameter. Ich habe noch nie einen mit mehr als ~ 10 Parametern geschrieben, und das brachte mich zum Nachdenken ... Ab wann gibt es zu viele Parameter?

Für den Kontext ... fügt diese Prozedur im Wesentlichen eine einzelne Zeile in eine einzelne Tabelle ein. Es würde auch eine sehr ähnliche geben; wenn auch etwas kleiner; Version, die ein UPDATE für dieselbe Tabelle ausführt . Die meisten Spalten sind relativ klein mit einer Mischung aus int und strings ( varchar(200)).

Was sind die Probleme; gut oder schlecht; Um eine Prozedur mit einer großen Anzahl von Parametern zu haben und an welcher Schwelle sollte ich anfangen, andere Muster zu berücksichtigen?

JoeGeeky
quelle
1
Ist genau wie "Wenn Sie den Preis fragen müssen, können Sie es sich nicht leisten". Wenn Sie sich fragen, wie viele Parameter zu viele sind, haben Sie zu viele. Das Hauptproblem ist nicht die Engine, sondern Sie, der menschliche Leser / Betreuer des Codes. Also würde ich sagen, es ist in Ordnung, so viele wie möglich in automatisch generiertem Code zu haben , aber man sollte vernünftigerweise den geschriebenen / gepflegten Code in der Hand halten.
Remus Rusanu

Antworten:

12

Probleme? Ich würde keine streiten.

  • Die Grenze liegt bei 2100 Parametern . IIRC ist seit SQL2000 2100, aber ein Dokumentationsfehler deutete auf 1024 hin.
  • Wenn eine Tabelle 1000 Spalten enthält ( z. B. aufgrund einer Sharepoint-ähnlichen Spaltenanordnung mit geringer Dichte ) und Sie den Zugriff über gespeicherte Prozeduren erzwingen, verfügt Ihr Einfügeprozess möglicherweise über 1000 Parameter. Daran ist nichts auszusetzen.
  • Machen Sie eine Pause, um das Schema zu überprüfen, wenn Sie auf eine breite Tabelle stoßen (nicht, dass 30 besonders breit ist). Es ist nicht ungewöhnlich, dass Tische, die zu Beginn des Lebens normalisiert waren, durch Faulheit und / oder Rücksichtslosigkeit bis zur Unkenntlichkeit erweitert wurden.
  • Denken Sie nicht einmal kurz daran, einen Parametersatz als CSV-Liste oder XML zu übergeben. Blendet den Abfrageoptimierer aus und spart wenig bis gar keine Zeit oder Mühe.
  • Drehen Sie den Client-Code nicht mit der Hand, um eine Prozedur mit einer großen Anzahl von Parametern aufzurufen. Tools zur Codegenerierung wie T4-Vorlagen oder CodeSmith helfen dabei .
Mark Storey-Smith
quelle
1
Vielen Dank für diese Antwort, es wurde sehr schön angegeben. Dies beantwortet meine Frage perfekt. Es ist nur schade, dass sie kein Abzeichen für die Verwendung von großartigen Scrabble-Wörtern wie " Fecklessness " haben
JoeGeeky
2

Joe Celko ist ein Verfechter langer Parameterlisten, über die er in diesem zweiteiligen Artikel ausführlich schreibt :

Die einfachste Antwort ist die Verwendung einer langen Parameterliste zum Erstellen von Listen und abgeleiteten Tabellen innerhalb des Prozedurenkörpers. SQL Server kann bis zu 2100 Parameter verarbeiten, was für praktische Zwecke mehr als ausreichend sein sollte. SQL Server ist in dieser Hinsicht tatsächlich ein Weichei. DB2 kann 32K-Parameter übergeben. und Oracle kann 64K-Parameter haben.

... die lange Parameterliste besteht aus einfachen alten Parametern, dh sie können sowohl für Ausgänge als auch für Eingänge verwendet werden. Es ist auch in einer Anweisung enthalten, die der Optimierer verwenden soll.

Glaube ich, dass diese Techniken immer die beste Lösung sein werden? Natürlich nicht. In SQL gibt es so etwas nicht. Aber es lohnt sich zu schauen, wann Sie ein passendes Problem bekommen.

eines Tages, wenn
quelle