Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Optymalizacja dynamicznego SQL i procedur składowanych

Jeśli masz wiele zagnieżdżonych bloków IF, SQL Server będzie mógł przechowywać plany wykonania. Zakładam, że IF są proste, np. JEŚLI @Parameter1 NIE JEST NULL

Odpowiedź SchmitzIT jest prawidłowa, że ​​SQL Server może również przechowywać ścieżki wykonania dla Dynamic SQL. Jednak jest to prawdą tylko wtedy, gdy sql jest poprawnie skompilowane i wykonane.

Prawidłowo zbudowany, mam na myśli jawne zadeklarowanie parametrów i przekazanie ich do sp_executesql. Na przykład

declare @Param1 nvarchar(255) = 'foo'
        ,@Param2 nvarchar(255) = 'bar'
        ,@sqlcommand nvarchar(max)
        ,@paramList nvarchar(max)

set @paramList = '@Param1 nvarchar(255), @Param2 nvarchar(255)'
set @sqlcommand = N'Select Something from Table where Field1 = @Param1 AND Field2 = @Param2'

exec sp_executesql @statement = @sqlcommand
                  ,@params = @paramList
                  ,@Param1 = @Param1
                  ,@Param2 = @Param2

Jak widać, tekst polecenia sqlcommand nie koduje na stałe wartości parametrów do użycia. Są one przekazywane osobno w exec sp_executesql

Jeśli piszesz zły stary dynamiczny sqL

set @sqlcommand = N'Select Something from Table where Field1 = ' + @Param1  + ' AND Field2 = ' + @Param2

exec sp_executesql @sqlcommand

wtedy SQL Server nie będzie w stanie przechowywać planów wykonania



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SSRS Filtr parametrów wielu wartości oparty na zbiorze danych

  2. SQL Server ROWLOCK nad SELECT, jeśli nie istnieje INSERT transakcja

  3. Jak mogę wykonać kopię zapasową zdalnej bazy danych SQL Server na dysku lokalnym?

  4. Dlaczego transakcja zagnieżdżona jest zatwierdzana, nawet jeśli TransactionScope.Complete() nigdy nie jest wywoływana?

  5. SQL — liczba procentowa