Проблемът е, че посочвате две условия с ИЛИ, които се прилагат към отделни таблици във вашата заявка. Поради това търсенето на неклъстериран индекс трябва да върне повечето или всички редове във вашата голяма таблица, тъй като логиката ИЛИ означава, че те също могат да съответстват на клаузата за условие във втората таблица.
Вижте плана за изпълнение на SQL и в трите примера по-горе и забележете броя на редовете, които излизат от неклъстерното търсене на индекс от голямата таблица. Крайният резултат може да върне само 1 000 или по-малко от 800 000 реда в таблицата, но клаузата ИЛИ означава, че съдържанието на тази таблица трябва да бъде кръстосано с условното във втората таблица, тъй като ИЛИ означава, че може да е необходимо за окончателното изход на заявка.
В зависимост от вашия план за изпълнение, търсенето на индекс може да извади всички 800 000 реда в голяма таблица, защото те също могат да съответстват на условията на клаузата ИЛИ във втората таблица. UNION ALL е две отделни заявки към една таблица всяка, така че търсенето на индекс трябва да изведе само по-малкия набор от резултати, който може да съответства на условието за тази заявка.
Надявам се това да има смисъл. Сблъсках се със същата ситуация, докато рефакторирах бавно работещи SQL изрази.
Наздраве,
Андре Раниери