Ostatnio widziałem pytanie „gdzie 1 = 1 zdanie” ; konstrukt SQL, którego często używałem przy konstruowaniu dynamicznego SQL, aby pisać czystszy kod (z perspektywy języka hosta).
Ogólnie rzecz biorąc, czy to dodanie do instrukcji SQL negatywnie wpływa na wydajność zapytań? Nie szukam odpowiedzi w odniesieniu do konkretnego systemu bazy danych (ponieważ użyłem jej w DB2, SQL Server, MS-Access i mysql) - chyba że nie można odpowiedzieć bez wchodzenia w szczegóły.
performance
optimization
tranzystor 1
źródło
źródło
1=1
WHILE 1=1
klauzuli. Jednak nie wydaje się mieć żadnego wykrywalnego wpływu na czas wykonywania.Odpowiedzi:
O ile mi wiadomo, wszystkie główne RDBMS mają ciągłe oceny. Powinno to ocenić niemal natychmiast w dowolnym z nich.
źródło
Z perspektywy SQL Server, jeśli robisz to,
WHERE 1=1
aby umożliwić dynamiczne przekazywanie parametrów i pomijanie parametru podczas oceny, sugerowałbym przeczytanie kilku artykułów z SQL Server MV Erland Sommarskog. Jego podejście eliminuje potrzebę wykonywania innych sztuczek w dynamicznym SQL (takich jakWHERE Column = Column
konstrukcja lub użycieWHERE (Col = Val OR 1=1) and (Col2 = Val2 OR 1=1)
konstruktu). 1 = 1 nie powinien powodować problemów z wydajnością, jak wspomniał @JNK (dałem +1 jego odpowiedzi i to ta, którą należy zaakceptować), myślę, że znajdziesz kilka dobrych wskazówek z artykułu Erlanda na temat Dynamiczny SQL, a zobaczysz również, że nadal używa tego1=1
w przypadkach, gdy nie są przekazywane żadne parametry, ale unika ich dla poszczególnych parametrów, które nie są przekazywane, po prostu nie robiźródło
Za pomocą MySQL możesz sprawdzić, uruchamiając EXPLAIN EXTENDED, a później POKAŻ OSTRZEŻENIA, aby zobaczyć aktualne zapytanie. tl; dr: zostaje zoptymalizowany.
źródło
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.
Został on usunięty w MySQL v 8.0.