Parametrierte Queries bei "... WHERE foo in (1, 2, 3)" sinnvoll?

Beantwortet Parametrierte Queries bei "... WHERE foo in (1, 2, 3)" sinnvoll?

  • Dienstag, 1. Mai 2012 15:28
     
     
    Hallo,

    ich möchte beginnen, das bisher durchgehend "dynamische SQL" einer Web-App umzustellen, also auf parametrierte Queries (aka variable binding) -- vor allem der Performance zu Liebe. Beispielsweise mit sp_executesql.

    Des öfteren verwende ich Konstrukte wie
    ... WHERE ... AND tabelle.feld in (1, 2, 3) AND ...
    Wobei Die Liste nicht nur 3 Elemente beinhalten kann, sondern auch mal 4, 10 oder 100 und alles dazwischen.

    Meine Frage: Eine solche LISTE ist ja KEIN eigener Datentyp. D. h. ich müsste sie bei der Parametrisierung durch einzelne INT abbilden:

    in (@p1, @p2, @p3)

    Das bedeutet aber, dass die Anzahl der Parameter je nach Länge der Liste variiert. Ich befürchte nun, dass der SQL-Server den Ausführungsplan für einen Query mit einer Liste mit 3 Elementen nicht für einen Query mit einer Liste mit 4 Elementen verwenden wird, weil er vom Aufbau her unterschiedlich ist.

    Ist das richtig?

    Ist es zielführend in so einem Fall überhaupt zu parametrisieren?

    Angenommen, die Listen können von 2 bis 100 Elemente haben, dann gäbe es ja 99 gecachte Ausführungspläne. Das käme mir komisch vor, ist aber vielleicht gar kein Problem?

    Ich hoffe die Frage ist verständlich. Bis vor kurzem kam mir gar nicht in den Sinn dass dynamisches SQL schlecht sein könnte. Habe natürlich schon gegoogelt was das Zeug hielt...

    LG,
    Paul
    • Bearbeitet eigelb Dienstag, 1. Mai 2012 15:30 fettdruck ergänzt
    •  

Alle Antworten