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

jeśli jeszcze w CTE?

spróbuj:

;with CTE_AorB
(
    select * from table_A WHERE (condition true)
    union all
    select * from table_B WHERE NOT (condition true)
),
CTE_C as
(
   select * from CTE_AorB // processing is removed
)

kluczem z dynamicznym warunkiem wyszukiwania jest upewnienie się, że używany jest indeks. Oto bardzo obszerny artykuł o tym, jak poradzić sobie z tym tematem:

Warunki dynamicznego wyszukiwania w T-SQL autorstwa Erlanda Sommarskog

obejmuje wszystkie problemy i metody prób pisania zapytań z wieloma opcjonalnymi warunkami wyszukiwania. Najważniejszą rzeczą, o którą musisz się martwić, nie jest powielanie kodu, ale użycie indeksu. Jeśli Twoje zapytanie nie użyje indeksu, będzie ono źle wykonywane. Istnieje kilka technik, których można użyć, które mogą lub nie pozwalają na użycie indeksu.

oto spis treści:

  Introduction
      The Case Study: Searching Orders
      The Northgale Database
   Dynamic SQL
      Introduction
      Using sp_executesql
      Using the CLR
      Using EXEC()
      When Caching Is Not Really What You Want
   Static SQL
      Introduction
      x = @x OR @x IS NULL
      Using IF statements
      Umachandar's Bag of Tricks
      Using Temp Tables
      x = @x AND @x IS NOT NULL
      Handling Complex Conditions
   Hybrid Solutions – Using both Static and Dynamic SQL
      Using Views
      Using Inline Table Functions
   Conclusion
   Feedback and Acknowledgements
   Revision History

jeśli korzystasz z odpowiedniej wersji SQL Server 2008, możesz skorzystać z dodatkowej techniki, zobacz:Warunki wyszukiwania dynamicznego w wersji T-SQL dla SQL 2008 (SP1 CU5 i nowsze)

Jeśli korzystasz z odpowiedniej wersji SQL Server 2008, możesz po prostu dodać OPTION (RECOMPILE) do zapytania, a wartość zmiennej lokalnej w czasie wykonywania jest używana do optymalizacji.

Rozważ to, OPTION (RECOMPILE) przyjmie ten kod (gdzie żaden indeks nie może być użyty z tym bałaganem OR s):

WHERE
    (@search1 IS NULL or [email protected])
    AND (@search2 IS NULL or [email protected])
    AND (@search3 IS NULL or [email protected])

i zoptymalizować go w czasie wykonywania (pod warunkiem, że tylko @Search2 został przekazany z wartością):

WHERE
    [email protected]

i można użyć indeksu (jeśli masz zdefiniowany w kolumnie2)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Serwer SQL wypełnia tabelę na podstawie innej tabeli z podciągiem jako nazwą kolumny

  2. Jak używać polecenia `sqlcmd` bez nazwy użytkownika i hasła w SQL Server 2008?

  3. Brak udostępnionych zestawów danych w eksploratorze rozwiązań w studiu rozwoju analizy biznesowej

  4. Dlaczego to CTE jest o wiele wolniejsze niż używanie tabel tymczasowych?

  5. Nie można znaleźć pliku microsoft.sqlserver.batchparser.dll