Ich verstehe, dass Sie vor SQL Server 2005 SQL Server "austricksen" konnten, um die Verwendung einer Reihenfolge in einer Ansichtsdefinition zu ermöglichen, indem Sie sie auch TOP 100 PERCENT
in die SELECT- Klausel aufnehmen. Ich habe jedoch anderen Code gesehen, den ich geerbt habe und der SELECT TOP 100 PERCENT
... in dynamischen SQL-Anweisungen verwendet (in ADO in ASP.NET- Apps usw. verwendet). Gibt es dafür einen Grund? Ist das Ergebnis nicht dasselbe wie das Nichteinbeziehen des TOP 100 PERCENT
?
sql
sql-server
tsql
Ed Schembor
quelle
quelle
Antworten:
Es wurde für " Zwischenmaterialisierung (Google-Suche) " verwendet
Guter Artikel: Adam Machanic: Die Geheimnisse der Zwischenmaterialisierung erforschen
Er hat sogar ein MS Connect angehoben, damit es sauberer gemacht werden kann
Meine Ansicht ist "nicht von Natur aus schlecht", aber verwenden Sie sie nur, wenn Sie 100% sicher sind. Das Problem ist, dass es nur zu dem Zeitpunkt funktioniert, zu dem Sie es tun, und wahrscheinlich nicht später (Patch-Level, Schema, Index, Zeilenanzahl usw.) ...
Gearbeitetes Beispiel
Dies kann fehlschlagen, weil Sie nicht wissen, in welcher Reihenfolge die Dinge ausgewertet werden
Und das kann auch daran scheitern
Dies war jedoch in SQL Server 2000 nicht der Fall. Die innere Abfrage wird ausgewertet und gespoolt:
Beachten Sie, dass dies in SQL Server 2005 weiterhin funktioniert
quelle
TOP (100) PERCENT ist in neueren Versionen von SQL Server völlig bedeutungslos und wird (zusammen mit dem entsprechenden ORDER BY im Fall einer Ansichtsdefinition oder einer abgeleiteten Tabelle) vom Abfrageprozessor ignoriert.
Sie haben Recht, dass es einmal als Trick verwendet werden konnte, aber selbst dann war es nicht zuverlässig. Leider haben einige der grafischen Tools von Microsoft diese bedeutungslose Klausel eingefügt.
Ich habe keine Ahnung, warum dies in dynamischem SQL angezeigt wird. Sie haben Recht, dass es keinen Grund dafür gibt und das Ergebnis ohne es dasselbe ist (und im Fall einer Ansichtsdefinition oder einer abgeleiteten Tabelle auch ohne die Klauseln TOP und ORDER BY).
quelle
TOP (100) PERCENT
: "... Ich könnte versuchen, eine Zwischenmaterialisierung der abgeleiteten Tabelle ohne temporäre Tabelle zu erzwingen, indem ich TOP 100 PERCENT in Verbindung mit ORDER BY verwende. Leider hat das SQL Server-Abfrageoptimierungsteam entschieden, dass dies nicht der Fall ist." Es ist eine gute Idee, und der Optimierer ignoriert solche Versuche jetzt. " Es unterstützt Sie in der Tat.Das ist keine gute Idee. In einer Ansicht sollte niemals ORDER BY definiert sein.
Ein ORDER BY wirkt sich auf die Leistung aus. Wenn Sie eine Ansicht verwenden, wird das ORDER BY im EXPLAIN-Plan angezeigt. Wenn Sie eine Abfrage haben, bei der die Ansicht mit etwas in der unmittelbaren Abfrage verknüpft ist oder auf die in einer Inline-Ansicht verwiesen wird (CTE / Unterabfrage-Factoring), wird ORDER BY immer vor dem endgültigen ORDER BY ausgeführt (vorausgesetzt, es wurde definiert). Das Bestellen von Zeilen, die nicht die endgültige Ergebnismenge sind, hat keinen Vorteil, wenn die Abfrage nicht TOP (oder LIMIT für MySQL / Postgres) verwendet.
Erwägen:
...
... entspricht der Verwendung von:
Das ist schlecht, weil:
ORDER BY item_type_description, item_description
quelle
Wenn es keine
ORDER BY
Klausel gibt,TOP 100 PERCENT
ist sie überflüssig. (Wie Sie bereits erwähnt haben, war dies der "Trick" mit Ansichten)[Hoffentlich optimiert der Optimierer dies weg.]
quelle
Der Grund dafür ist einfach: Enterprise Manager hat versucht, hilfreich zu sein und Ihren Code so zu formatieren, dass er dies für Sie enthält. Es hatte keinen Sinn, jemals zu versuchen, es zu entfernen, da es nichts wirklich verletzte und das nächste Mal, wenn Sie es änderten, EM es wieder einfügte.
quelle
Kein Grund außer Gleichgültigkeit, würde ich vermuten.
Solche Abfragezeichenfolgen werden normalerweise von einem grafischen Abfragetool generiert. Der Benutzer verbindet einige Tabellen, fügt einen Filter und eine Sortierreihenfolge hinzu und testet die Ergebnisse. Da der Benutzer die Abfrage möglicherweise als Ansicht speichern möchte, fügt das Tool TOP 100 PERCENT hinzu. In diesem Fall kopiert der Benutzer jedoch die SQL in seinen Code, parametrisiert die WHERE-Klausel und versteckt alles in einer Datenzugriffsschicht. Aus dem Kopf, aus den Augen.
quelle
Bitte versuchen Sie das Folgende, hoffe, es wird für Sie funktionieren.
quelle
Der Fehler sagt alles ...
Verwenden Sie nicht
TOP 100 PERCENT
, verwenden SieTOP n
, wobei N eine Zahl istDer TOP 100 PERCENT (aus Gründen, die ich nicht kenne) wird von SQL Server VIEW (Versionen nach 2012) ignoriert, aber ich denke, MS hat ihn aus Syntaxgründen beibehalten. TOP n ist besser und funktioniert in einer Ansicht und sortiert sie wie gewünscht, wenn eine Ansicht anfänglich verwendet wird. Seien Sie jedoch vorsichtig .
quelle
Ich würde annehmen, dass Sie eine Variable im Ergebnis verwenden können, aber abgesehen davon, dass Sie das Stück ORDER BY in einer Ansicht erhalten, sehen Sie keinen Vorteil, wenn Sie implizit "TOP 100 PERCENT" angeben:
quelle
Why use Select Top 100 Percent
nicht, eine variable Anzahl für den Prozentsatz zu erhalten.Probieren Sie es einfach aus, es erklärt es so ziemlich selbst. Sie können keine Ansicht mit einem ORDER BY erstellen, außer wenn ...
quelle