Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

IsNumeric in SQL Server-JOIN

Sie können sich nicht auf die Reihenfolge verlassen, in der eine Datenbank Filterausdrücke auswertet. Es gibt einen Abfrageoptimierer, der Ihr SQL auswertet und einen Plan zur Ausführung der Abfrage erstellt, basierend auf dem, was seiner Meinung nach die beste Leistung ergibt .

In diesem Zusammenhang IsNumeric() kann nicht mit einem Index verwendet werden, und es bedeutet, dass eine Funktion für jede Zeile in der Tabelle ausgeführt wird. Daher wird es fast nie bieten die beste wahrgenommene Leistung. Vergleichen Sie diese mit der SrcID > 15 Ausdruck, der mit einem Index (falls vorhanden) abgeglichen werden kann und nur ein einzelner Operatorausdruck ist, selbst wenn keiner vorhanden ist. Es kann auch verwendet werden, um die Anzahl potenzieller Zeilen herunterzufiltern, in denen IsNumeric() ist Funktion muss ausgeführt werden.

Sie können dies wahrscheinlich mit einer Ansicht, einer Unterabfrage, einem CTE, einer CASE-Anweisung oder einer berechneten Spalte umgehen. Hier ist ein CTE-Beispiel:

With NumericOnly As 
(
    SELECT <columns> FROM MyTable WHERE IsNumeric(SrcID) = 1
)
SELECT <columns> FROM NumericOnly WHERE SrcID > 15

Und hier ist eine CASE-Anweisungsoption:

SELECT <columns> FROM MyTable WHERE CASE WHEN IsNumeric(SrcIC) = 1 THEN Cast(SrcID As Int) ELSE 0 END > 15