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

warunek UNION ALL vs OR w zapytaniu serwera sql

Problem polega na tym, że określasz dwa warunki za pomocą LUB, które dotyczą oddzielnych tabel w zapytaniu. Z tego powodu wyszukiwanie indeksu nieklastrowego musi zwrócić większość lub wszystkie wiersze w dużej tabeli, ponieważ logika OR oznacza, że ​​mogą one również odpowiadać klauzuli warunku w drugiej tabeli.

Spójrz na plan wykonania SQL we wszystkich trzech powyższych przykładach i zwróć uwagę na liczbę wierszy, które pochodzą z wyszukiwania indeksu nieklastrowanego z dużej tabeli. Ostateczny wynik może zwrócić tylko 1000 lub mniej z 800 000 wierszy w tabeli, ale klauzula OR oznacza, że ​​zawartość tej tabeli musi być powiązana z warunkiem w drugiej tabeli, ponieważ OR oznacza, że ​​mogą być potrzebne do ostatecznego dane wyjściowe zapytania.

W zależności od planu wykonania, wyszukiwanie indeksu może wyciągnąć wszystkie 800 000 wierszy w dużej tabeli, ponieważ mogą one również odpowiadać warunkom klauzuli OR w drugiej tabeli. UNION ALL to dwa oddzielne zapytania dotyczące jednej tabeli, więc wyszukiwanie indeksu musi wyprowadzić tylko mniejszy zestaw wyników, który może pasować do warunku dla tego zapytania.

Mam nadzieję, że to ma sens. Natknąłem się na tę samą sytuację podczas refaktoryzacji wolno działających instrukcji SQL.

Pozdrawiam,

Andre Ranieri



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dynamicznie przypisz nazwę pliku do ciągu połączenia programu Excel

  2. Uruchom SERVERPROPERTY() na połączonym serwerze w SQL Server

  3. Zrozumienie funkcji PIVOT w T-SQL

  4. SQL DELETE z INNER JOIN

  5. Czy MAMP powinien zwrócić ::1 jako IP na hoście lokalnym?