Ich habe kürzlich die Frage "where 1 = 1 statement" gesehen . Ein SQL-Konstrukt, das ich häufig beim Erstellen von dynamischem SQL verwendet habe, um saubereren Code zu schreiben (aus Sicht der Host-Sprache).
Beeinträchtigt dieser Zusatz zu einer SQL-Anweisung im Allgemeinen die Abfrageleistung? Ich suche keine Antwort in Bezug auf ein bestimmtes Datenbanksystem (weil ich es in DB2, SQL Server, MS-Access und MySQL verwendet habe) - es sei denn, es ist unmöglich zu antworten, ohne auf Einzelheiten einzugehen.
performance
optimization
transistor1
quelle
quelle
1=1
WHILE 1=1
Klausel nicht optimiert . Es scheint jedoch keinen erkennbaren Einfluss auf die Ausführungszeit zu haben.Antworten:
Soweit ich weiß, haben alle wichtigen RDBMS konstante Auswertungen vorgenommen. Dies sollte in jedem von ihnen ziemlich augenblicklich ausgewertet werden.
quelle
Wenn Sie aus SQL Server-Sicht
WHERE 1=1
die dynamische Übergabe von Parametern zulassen und die Auswertung eines Parameters überspringen möchten, empfehle ich Ihnen, einige Artikel von SQL Server MV Erland Sommarskog zu lesen. Sein Ansatz beseitigt die Notwendigkeit, andere Tricks in dynamischem SQL auszuführen (wie dasWHERE Column = Column
Konstrukt oder die Verwendung einesWHERE (Col = Val OR 1=1) and (Col2 = Val2 OR 1=1)
Konstrukts). Das 1 = 1 sollte keine Performance-Probleme verursachen, wie @JNK erwähnt hat (ich habe seine Antwort dort +1 gegeben und das ist die, die akzeptiert werden sollte). Ich denke, Sie werden einige gute Tipps aus Erlands Artikel finden Dynamisches SQL und Sie werden sehen, dass er immer noch das1=1
für die Fälle verwendet, in denen keine Parameter übergeben werden, aber er vermeidet sie für einzelne Parameter, die nicht übergeben werden.quelle
Mit MySQL können Sie EXPLAIN EXTENDED und höher SHOW WARNINGS ausführen, um die aktuelle Abfrage anzuzeigen. tl; dr: es wird weg optimiert.
quelle
In older MySQL releases, extended information was produced using EXPLAIN EXTENDED. That syntax is still recognized for backward compatibility but extended output is now enabled by default, so the EXTENDED keyword is superfluous and deprecated. Its use results in a warning, and it will be removed from EXPLAIN syntax in a future MySQL release.
Es wurde in MySQL v 8.0 entfernt.