Ервін: Я б погоджувався з думкою, що використання USING, що спричиняє жорстке впорядкування, може створити багато кращих випадків, коли оптимальні плани будуть виключені. Нещодавно я допоміг комусь, у кого було щось подібне у його запиті:
LEFT JOIN (
a
JOIN b ON a.id = b.a_id
JOIN c ON b.c_id = c.id
) ON a.id = something.a_id
LEFT JOIN (
table1 t1
JOIN table2 t2 ON t1.some_field = t2.other_field
JOIN talbe3 t3 ON t2.yafield = t3.something_else
) ON ....
repeat a few more times
У його випадку найгірше з цих блоків об'єднання викликало вкладення вкладеного циклу через 200k рядків, приблизно в 20 тис. Разів (зробіть математику), і оскільки ключі не вдалося натиснути на індекси, це було послідовною скануванням. Це означало, що загальний запит зайняв близько 3 годин через каскадні зміни плану. Розподіливши ліве з'єднання, клавіші можна було натиснути вниз і запит запустився за лічені секунди. Звичайно, це не зовсім рівнозначно, тому планувальник не може ставитись до них як до рівнозначних, і тому було залишено з'ясувати цей план як хеш-з'єднання, а потім робити вкладений цикл, який був болісно повільним.
Щоразу, коли ви жорстко змушуєте об'єднання проходити в певному порядку, ви вводите випадки, коли ключова інформація про фільтр ще не доступна при виконанні плану, і тому, що може бути зроблено пізніше при швидкому скануванні / хеш-приєднанні можливо, доведеться робити набагато повільніше під час вкладеного циклу / послідовного сканування, і, хоча вищезазначений фрагмент не є одразу еквівалентним, він показує ту саму проблему.
USING
це трохи швидше - оскільки це призводить до одного стовпчика менше в матриці результатів. Ваші висновки відносяться до 2005 та 2008 років. Я припускаю, що будь-які проблеми вже були виправлені. Однак я можу побачити можливе обмеження: JOIN з,USING
можливо, доведеться застосовувати для того , щоб отримані з'єднувальні стовпці були спільним продуктом. Тим самим потенційно обмежуючи варіанти переупорядкування JOIN.