Что лучше выбрать, прежде чем присоединиться? - PullRequest
2 голосов
/ 08 сентября 2011

Мне нужно объединить 3 таблицы a, b, c, и я знаю, что в конечном результате должна появиться только одна строка из самой левой таблицы.

SELECT * 
    FROM a 
        LEFT JOIN b 
            ON a.id = b.id 
        LEFT JOIN c 
            ON c.id2 = b.id2
    WHERE a.id = 12;

Я предложил следующий запрос, потому что он кажется более эффективным, но выполнение обоих запросов занимает одно и то же время. Это потому, что первый запрос оптимизирован? Стоит ли выбирать более эффективный (второй) запрос или придерживаться первого, потому что он более читабелен?

SELECT * 
    FROM (SELECT * FROM a WHERE id=12) AS temp 
        LEFT JOIN b 
            ON temp.id = b.id 
        LEFT JOIN c
            ON b.id2 = c.id2;

Ответы [ 2 ]

1 голос
/ 22 ноября 2011

Как всегда с оптимизацией запросов, ответ должен быть: это зависит. Ответ зависит от нескольких вещей, в том числе:

  • Есть ли на самом деле выигрыш в производительности, если использовать запрос 2 вместо запроса 1. Это можно увидеть в плане запросов, который создается для этих запросов. Созданный план запроса может быть одинаковым для обоих запросов, но он также может отличаться при использовании индексов.
  • Это также может зависеть от количества строк в запрашиваемых таблицах. Как долго выполняется запрос и как часто он используется. Если вы начнете оптимизировать запрос, который используется один раз в день и выполняется в течение нескольких миллисекунд, вам лучше использовать запрос, который лучше всего читается.

Таким образом, единственный человек, который действительно может определить, следует ли вам использовать запрос 1 или запрос 2, - это вы. Невозможно дать вам здравый совет по этой теме.

0 голосов
/ 16 мая 2012

Да, лучше выбрать, прежде чем присоединиться.

предполагается:

1000000 записей в таблице A, 20000 записей в таблице B и 500000 записей в таблице C

для первого запроса

1: чтение 1000000 таблиц форм записи A -------------------------- 1000000 I / O

2: запись 1000000 результатов + чтение 20000 из B --------------- 2020000 операций ввода-вывода

3: записать 2020000 результатов + прочитать 500000 из C ------------- 4540000 I / O

4: Результат фильтра 4540000 + запись вывода 1 --------------------- 9080001 Ввод / вывод [Всего]


для второго запроса

1: чтение 1000000 таблиц форм записи A -------------------------- 1000000 I / O

2: Результат фильтра 1000000 + Запись 1 ------------------------------ 1000001 I / O

3: запись 1 результата + чтение 20000 из B ------------------------ 1020001 I / O

4: запись 1 результата + чтение 500000 из C ---------------------- 1520001 I / O

5: записать результат вывода 1 ----------------------------------------- - 1520002 I / O [Всего]


Пожалуйста, обратитесь по этой ссылке

...