Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Състояние UNION ALL спрямо OR в заявка за sql сървър

Проблемът е, че посочвате две условия с ИЛИ, които се прилагат към отделни таблици във вашата заявка. Поради това търсенето на неклъстериран индекс трябва да върне повечето или всички редове във вашата голяма таблица, тъй като логиката ИЛИ означава, че те също могат да съответстват на клаузата за условие във втората таблица.

Вижте плана за изпълнение на SQL и в трите примера по-горе и забележете броя на редовете, които излизат от неклъстерното търсене на индекс от голямата таблица. Крайният резултат може да върне само 1 000 или по-малко от 800 000 реда в таблицата, но клаузата ИЛИ означава, че съдържанието на тази таблица трябва да бъде кръстосано с условното във втората таблица, тъй като ИЛИ означава, че може да е необходимо за окончателното изход на заявка.

В зависимост от вашия план за изпълнение, търсенето на индекс може да извади всички 800 000 реда в голяма таблица, защото те също могат да съответстват на условията на клаузата ИЛИ във втората таблица. UNION ALL е две отделни заявки към една таблица всяка, така че търсенето на индекс трябва да изведе само по-малкия набор от резултати, който може да съответства на условието за тази заявка.

Надявам се това да има смисъл. Сблъсках се със същата ситуация, докато рефакторирах бавно работещи SQL изрази.

Наздраве,

Андре Раниери



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Промяна на съпоставянето на SQL Server на нечувствително към главни и малки букви?

  2. SQRT() Примери в SQL Server

  3. 3 метода за възстановяване на всички индекси за всички таблици с T-SQL в база данни на SQL Server

  4. Замяна на множество символи в низ в SQL Server (T-SQL)

  5. Как да използвате ВСЕКИ / НЯКОЙ логически оператор в SQL Server - SQL Server / TSQL урок, част 127