Почему первый код быстрее второго?
Просьба, если несложно, немного "разжевать" процесс. Например, когда я после FROM объявляю таблицу, параметров которой нет в SELECT, насколько это затратно. Почему так не делают?
SELECT a.model, price
FROM (
SELECT model, price FROM PC
UNION
SELECT model, price FROM Laptop
UNION
SELECT model, price FROM Printer
) AS a
JOIN Product p ON a.model = p.model
WHERE p.maker = 'B';
SELECT p.model,p.price
FROM printer p, product prod
WHERE maker='B' AND p.model=prod.model
UNION
SELECT l.model,l.price
FROM laptop l, product prod
WHERE maker='B' AND l.model=prod.model
UNION
SELECT pc.model,pc.price FROM pc, product prod
WHERE maker='B' AND pc.model=prod.model
Ответы (1 шт):
Давайте посмотрим что и как прочитайте что вы написали.
Разберем сначала Union
UNION по сути добавляет результаты второго запроса к результатам первого (хотя никакой порядок возвращаемых строк при этом не гарантируется). Более того, эта операция убирает дублирующиеся строки из результата так же, как это делает DISTINCT, если только не указано UNION ALL.
Объединить отфильтровать
- 3 таблицы объединяем 1 раз фильтруем.
SELECT a.model, price FROM ( SELECT model, price FROM PC UNION SELECT model, price FROM Laptop UNION SELECT model, price FROM Printer ) AS a JOIN Product p ON a.model = p.model WHERE p.maker = 'B';Отфильтровать объединить
- 3 таблицы фильтруем и обединяем 3 таблицы
SELECT p.model,p.price FROM printer p, product prod WHERE maker='B' AND p.model=prod.model UNION SELECT l.model,l.price FROM laptop l, product prod WHERE maker='B' AND l.model=prod.model UNION SELECT pc.model,pc.price FROM pc, product prod WHERE maker='B' AND pc.model=prod.model
А вообще рекомендую сделать так
SELECT DISTINCT a.model, price
FROM (
SELECT model, price FROM PC
UNION ALL
SELECT model, price FROM Laptop
UNION ALL
SELECT model, price FROM Printer
) AS a
JOIN Product p ON a.model = p.model
AND p.maker = 'B';
PS. Возращаясь к основному вопросу. Почему первый код быстрее второго? - На самом деле всё зависит от задач и количества данных. Собрать данные в одну таблицу потом фильтровать не всегда быстрее чем подготовить и объединить. пример
К вопросу плохой практики. Это часть синтаксиса. Хорош или плох вот так вот я бы не судил. Я очень редко объединяю таблицы. Поскольку вижу смысл разделения только в ускорении и уменьшении данных. Все данные которые должны объединяться могут спокойно подождать и не расходовать слишком много ресурсов.