Почему первый код быстрее второго?

Просьба, если несложно, немного "разжевать" процесс. Например, когда я после 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 шт):

Автор решения: Aziz Umarov

Давайте посмотрим что и как прочитайте что вы написали.

Разберем сначала Union

UNION по сути добавляет результаты второго запроса к результатам первого (хотя никакой порядок возвращаемых строк при этом не гарантируется). Более того, эта операция убирает дублирующиеся строки из результата так же, как это делает DISTINCT, если только не указано UNION ALL.

  1. Объединить отфильтровать

    • 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';
    
  2. Отфильтровать объединить

    • 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. Возращаясь к основному вопросу. Почему первый код быстрее второго? - На самом деле всё зависит от задач и количества данных. Собрать данные в одну таблицу потом фильтровать не всегда быстрее чем подготовить и объединить. пример

К вопросу плохой практики. Это часть синтаксиса. Хорош или плох вот так вот я бы не судил. Я очень редко объединяю таблицы. Поскольку вижу смысл разделения только в ускорении и уменьшении данных. Все данные которые должны объединяться могут спокойно подождать и не расходовать слишком много ресурсов.

→ Ссылка