Имя: Пароль:
1C
1С v8
Оптимизация запроса: условие в соединении или в ГДЕ
0 Ymryn
 
26.05.15
17:16
Мое почтение. Приношу извинения, если ошибся разделом, не смог точно определить где будет уместно, поэтому решил завести в ветке 1С8. Все-таки близкая тема.

Итак есть запрос.
SELECT L.ID as ID, COUNT(L.ID) as CNT
FROM
b_crm_lead L
LEFT JOIN b_crm_usr_act UA ON UA.USER_ID IN (0,2530) AND UA.OWNER_ID = L.ID AND UA.OWNER_TYPE_ID = 1
GROUP BY
L.ID
ORDER BY
MAX(UA.USER_ID) DESC, MAX(UA.SORT) ASC, L.ID ASC
LIMIT 0, 20

друг утверждает, что перенос условий на UA.USER_ID IN (0,2530) и UA.OWNER_TYPE_ID = 1 (думаю аналогия с стандартными 1С запросами для многих ясна) из условий соединения в блок Where (Где), дает где-то n-цать кратный прирост производительности. Я в упор не могу понять за счет чего (он мне объяснить не смог, его дернули по работе в середине нашего разбирательства, освободится завтра). А очень и очень интересно и хочется устранить данный пробел в своих знаниях. Если кто-то сможет объяснить буду очень признателен :)
1 ДенисЧ
 
26.05.15
17:16
план запроса посмотри
2 Fragster
 
гуру
26.05.15
17:17
потому что left  превращается в inner
3 Fragster
 
гуру
26.05.15
17:18
(1)+ если mysql - см. explain http://habrahabr.ru/post/31129/
4 Ymryn
 
26.05.15
17:19
(2) это я понимаю. Но это уменьшит конечную выборку, но не должно давать такой прирост по производительности на этапе самой выборки. Ведь этот Where все равно наложится на общую таблицу.
5 Fragster
 
гуру
26.05.15
17:19
(4) нет, результаты запросов будут разные
6 Ymryn
 
26.05.15
17:22
(4) согласен. Результат разный. Я на уровне теории не понимаю, почему взять таблицу, перебрать вторую таблицу полностью по одному условию, потом перебрать получившуюся таблицу будет настолько быстрее чем перебрать изначально вторую таблицу по трем условиям. Неужели дополнительные условия при соединении такие тормозные?
Мне именно теория сейчас интересна, поразбираться с планом запроса сейчас не смогу, ибо базой не обладаю.
7 Fragster
 
гуру
26.05.15
17:23
(6) потому что оптимизатор умный. и если ты в (0) поставишь inner с разу - то никакого прироста не будет - всё срезу будет быстро.
8 Ymryn
 
26.05.15
17:25
(7) благодарю. Понял приблизительно. Еще покопаюсь самостоятельно. Огромное спасибо.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший