Няма съмнение, че версия 1 - отделни клаузи where във всяка страна на съюза - ще бъде по-бърза. Нека да разгледаме защо версията - където клаузата над резултата от обединението - е по-лоша:
- обем на данни:винаги ще има повече редове в резултата от обединението, защото има по-малко условия за това какви редове се връщат. Това означава повече I/O на диска (в зависимост от индексите), повече временно хранилище за съхранение на набора от редове, което означава повече време за обработка
- повторено сканиране:целият резултат от обединението трябва да бъде сканиран отново, за да се приложи условието, когато е можело да бъде обработено по време на първоначалното сканиране. Това означава двойно обработване на набора от редове, макар и вероятно в паметта, все пак е допълнителна работа.
- индексите не се използват за клаузи where в резултат от обединение. Ако имате индекс над полетата за външен ключ и postType, няма да се използва
Ако искате максимална производителност, използвайте UNION ALL
, който предава редовете направо в резултата без допълнителни разходи, вместо UNION
, който премахва дубликати (обикновено чрез сортиране) и може да бъде скъп и ненужен въз основа на вашите коментари
Дефинирайте тези индекси и използвайте версия 1 за максимална производителност:
create index t1_authorID_postType on t1(authorID, postType);
create index t1_websiteID_postType on t1(websiteID, postType);