Внутреннее объединение против Союза всех - PullRequest
4 голосов
/ 20 февраля 2012

Какая версия запроса быстрее / лучшая практика? (Любопытная вещь.)

Что более важно, они эквивалентны?

Выполняют ли эти запросы одно и то же в этом примере?

1) INNER JOIN с двумя условиями OR:

SELECT
  DISTINCT (cat.id) as 'Cat ID:'
FROM
  cat
INNER JOIN cuteness_showdown ON
  (cat.id = cuteness_showdown.cat_1 OR cat.id = cuteness_showdown.cat_2);

2) Запроскаждый столбец отдельно и UNION ALL:

SELECT
  DISTINCT (table_1.id) as 'Cat ID:'
FROM
  (SELECT
    cuteness_showdown.cat_1 AS id
  FROM
    cuteness_showdown
  UNION ALL
  SELECT
    cuteness_showdown.cat_2 AS id
    FROM
    cuteness_showdown) AS table_1;

Теперь, какая версия является более быстрой / оптимальной, если мне нужен столбец из другой таблицы?

1) INNER JOINс двумя условиями ИЛИ (без изменений):

SELECT
  DISTINCT (cat.id) as 'Cat ID:',
  cat.name as 'Cat Name:'
FROM
  cat
INNER JOIN cuteness_showdown ON
  (cat.id = cuteness_showdown.cat_1 OR cat.id = cuteness_showdown.cat_2);

2) Запрашивать каждый столбец отдельно и UNION ALL (необходимо для INNER JOIN cat table):

SELECT
  DISTINCT (table_1.id) as 'Cat ID:'
  cat.name as 'Cat Name:'
FROM
  (SELECT
    cuteness_showdown.cat_1 AS id
  FROM
    cuteness_showdown
  UNION ALL
  SELECT
    cuteness_showdown.cat_2 AS id
  FROM
    cuteness_showdown) AS table_1
INNER JOIN cat on
  (table_1.id = cat.id);

Ответы [ 2 ]

4 голосов
/ 20 февраля 2012

Чтобы выяснить, что быстрее, разбейте терминал, напишите скрипт, который запускается каждые 1000 раз, и сравните результаты:)

Что касается того, являются ли они эквивалентными, оптимизатор запросов очень часто придумывает один и тот же план выполнения для нескольких запросов SQL, которые делают одно и то же, поэтому они вполне могут быть. Я не могу сказать вам, получат ли эти лица такое лечение, но вы можете использовать EXPLAIN, чтобы увидеть планы выполнения для себя и сравнить их, предполагая, что у вас есть некоторые данные.

Если планы выполнения действительно одинаковы, рекомендуется выбрать более читаемый оператор, чтобы любой, кто придет поддержать код, мог это легко сделать. В качестве альтернативы, если они не совпадают, вам нужно решить, стоит ли сложное для чтения утверждение о дополнительном выигрыше в производительности, который зависит от того, насколько высока производительность сделки в вашем проекте. Я бы сказал, что если у вас относительно небольшая БД, которая вряд ли сильно масштабируется, и время отклика менее 10 мс, то производительность не является проблемой, поэтому просто поддерживайте ее в обслуживании.

2 голосов
/ 20 февраля 2012

Есть еще один вариант,

SELECT
  DISTINCT (cat.id) as 'Cat ID:'
FROM
  cat
INNER JOIN cuteness_showdown ON
  cat.id IN (cuteness_showdown.cat_1,cuteness_showdown.cat_2)

Очень незначительная разница, но, по-видимому, IN () всегда казался более эффективным для ключей, чем для OR, посмотрим, смогу ли я так или иначе смоделировать некоторые таблицы для некоторых надежных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...