|
|
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. Вопрос: Существует ли разница между этими двумя запросами с точки зрения внутреннего выполнения? Суть (откуда ноги у вопроса растут): если мы точно знаем, что одно условие существенно сужает подмножество и разумнее выполнить его первым, а уже последующими условиями ковыряться в сильно уменьшенном подмножестве, чем ковыряться сразу во всей базе, а затем сужать уже отковыренное подмножество... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 12:47:17 |
|
||
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
Кэп говорит, что это зависит от наличия индексов на этих полях и от их кардиналити. Но может быть вы что-то ещё имели в виду? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 12:57:18 |
|
||
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
Lumixесли мы точно знаем, что одно условие существенно сужает подмножество и разумнее выполнить его первым, а уже последующими условиями ковыряться в сильно уменьшенном подмножестве, чем ковыряться сразу во всей базе, а затем сужать уже отковыренное подмножество... Ещё разумнее создать индекс по двум полям и выполнять Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 13:14:23 |
|
||
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
Lumix, Очень хочется посоветовать книгу Льюис Джонатан "Oracle. Основы стоимостной оптимизации". Там, конечно, больше половины к MySQL неприменимо, но все равно почитать стоит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 13:35:43 |
|
||
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
AkinaЕщё разумнее создать индекс по двум полям и выполнять Код: sql 1. Зависит от соотношения селективности конкретных условий. Бывает, что одно условие выбирает одну запись из миллиона, а второе каждую вторую. Тогда поле для второго условия скорее нет смысла включать в индекс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 13:38:56 |
|
||
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
miksoftБывает, что одно условие выбирает одну запись из миллиона, а второе каждую вторую. Тогда поле для второго условия скорее нет смысла включать в индекс. В этом случае (индекс только по первому полю) я думаю, что простой запрос с 2 условиями всё равно окажется эффективнее варианта с подзапросом. Потому что выполнит ровно то же самое, но без материализации (пусть и в памяти) субвыборки по первому полю. При условии, конечно, что оптимизатор нигде не накосячит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 13:46:21 |
|
||
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
AkinamiksoftБывает, что одно условие выбирает одну запись из миллиона, а второе каждую вторую. Тогда поле для второго условия скорее нет смысла включать в индекс. В этом случае (индекс только по первому полю) я думаю, что простой запрос с 2 условиями всё равно окажется эффективнее варианта с подзапросом. Потому что выполнит ровно то же самое, но без материализации (пусть и в памяти) субвыборки по первому полю. При условии, конечно, что оптимизатор нигде не накосячит.Сильно зависит от конкретной ситуации. Если индекса в кэше нет (не использовался ранее, был вымыт оттуда или вообще не влезает), то может оказаться выгоднее десяток лишних раз слазить в таблицу, нежели читать с диска индекс удвоенного размера. Конечно, это тяжело прогнозировать и часто приходится выяснять методом проб. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 13:50:25 |
|
||
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
Lumix Код: sql 1. 2. 3. 4. 5. Вопрос: Существует ли разница между этими двумя запросами с точки зрения внутреннего выполнения? Суть (откуда ноги у вопроса растут): если мы точно знаем, что одно условие существенно сужает подмножество и разумнее выполнить его первым, а уже последующими условиями ковыряться в сильно уменьшенном подмножестве, чем ковыряться сразу во всей базе, а затем сужать уже отковыренное подмножество... Уплощаем запрос: Код: sql 1. 2. 3. Д/З: попробуй уплощить второй запрос и найти разницу между двумя запросами после этого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 15:47:02 |
|
||
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
Lumix Суть (откуда ноги у вопроса растут): если мы точно знаем, что одно условие существенно сужает подмножество и разумнее выполнить его первым, а уже последующими условиями ковыряться в сильно уменьшенном подмножестве, чем ковыряться сразу во всей базе, а затем сужать уже отковыренное подмножество... Ты предполагаешь, что последовательность выполнения частей запроса зависит от структуры этого запроса. Твоё предположение ошибочно. Последовательность выполнения частей запроса зависит от того, как сработал оптимизатор и какой план он построил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 15:48:39 |
|
||
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
MasterZivТы предполагаешь, что последовательность выполнения частей запроса зависит от структуры этого запроса. Твоё предположение ошибочно. Последовательность выполнения частей запроса зависит от того, как сработал оптимизатор и какой план он построил. Да, я в курсе, что sql - это декларативный язык. И я понимаю, что where a = 1 && b = 1 и where b = 1 && a = 1 - это одно и то же. В данном случае я хотел узнать, игнорит ли мускул вложенность запросов или он обращает на это внимание и сначала выполняет "внутренние" запросы, а затем все более "внешние". Но если все эти три запроса внутри выполняются полностью одинаково вне зависимости от их синтаксической разницы, тогда я вопрос можно считать закрытым. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Я прекрасно понимаю, что все эти три запроса дают один и тот же результат и мне было забавно получить советы "упростить" запрос.)))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 17:34:54 |
|
||
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
Lumix, А Вы планы этих запросов смотрели? Они разные/одинаковые? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 17:39:18 |
|
||
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
miksoftА Вы планы этих запросов смотрели? Они разные/одинаковые? Все три плана очень сильно отличаются. Планы для вложенных запросов двухстрочные primary + derived План для запроса без вложения однострочный simple. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 18:05:55 |
|
||
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
LumixИ я понимаю, что where a = 1 && b = 1 и where b = 1 && a = 1 - это одно и то же. Ты всё время пишешь && , в то время как нужно писать AND . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 18:11:30 |
|
||
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
LumixВ данном случае я хотел узнать, игнорит ли мускул вложенность запросов или он обращает на это внимание и сначала выполняет "внутренние" запросы, а затем все более "внешние". На все такие вопросы тебе могут ответить два источника данных: напечатанный план запроса исходный код MySQL Если ты хочешь выработать для себя правила, как лучше писать запросы, то вот они (в первом приближении): -- не делай лишних подзапросов, если без этого никак. В том числе, не делай подзапросы во фразе FROM, если это не необходимо. -- формулируй запрос в каноническом виде SELECT ... FROM t1 JOIN t2 ... LEFT JOIN t3 ... where ... [group by ... [having ]] -- условия выборки пиши в WHERE -- условия JOIN-ов -- в JOIN-ах во фразе ON. -- используй параметры запросов. может что-то ещё, но это -- основное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 18:17:56 |
|
||
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
MasterZivТы всё время пишешь && , в то время как нужно писать AND . А собственно what's the problem? У нас в продакшене весь мускульный код с ампрессандами... MasterZivНа все такие вопросы тебе могут ответить два источника данных: напечатанный план запроса Я всегда думал, что план запроса используется лишь для проверки подцепились индексы или нет. Мне почему-то всегда казалось, что внутри мускула все равно будет какая-то другая магия, нежели в explain. MasterZivНа все такие вопросы тебе могут ответить два источника данных: исходный код MySQL На это, если честно, яиц не хватает. :-)))) Не осилю я такое... Такие занятия - это для совсем головастиков, а я к таким не отношусь... Всякие итмошники таких как мы называют быдлокодеры)))) И не без оснований, кстати))) Но мы не обижаемся... Я отлично понимаю что такое супер-пупер программист и более чем понимаю, что таким как я до них как до парижа раком...))) а те, кто считает себя супер-пупер, то как правило 15 минут общения с ними бывает достаточно чтобы понять, что они просто ни разу в жизни не видели живого супер-пупера, вот и строят из себя звезду россии... а все реальные супер-пуперы они не высовываются и особо на свет не лезут...))) Если сравнивать с военными, то лезть в сорсы мускула - это как задача для спецназа А я в условиях этой метафоры я даже не вдв... просто командир оисб и всего-то...)))) MasterZivЕсли ты хочешь выработать для себя правила, как лучше писать запросы, то вот они (в первом приближении): неее... я так не смогу... я никогда не пользуюсь правилами, если их не понимаю... MasterZiv-- не делай лишних подзапросов, если без этого никак. В том числе, не делай подзапросы во фразе FROM, если это не необходимо. почему нет? понятно, что когда на каждую запись основного запроса каждый вызов подзапроса пробегает всю базу заново... но если как в примере запросов этой темы, я никого "криминала" не вижу вообще... MasterZiv-- формулируй запрос в каноническом виде SELECT ... FROM t1 JOIN t2 ... LEFT JOIN t3 ... where ... [group by ... [having ]] вообще непонятное правило... я например, не знаю что такое неканонический вид... я не понимаю это правило, потому что не знаю других форм селектов... я реально не знаю как ещё можно это написать))) ну не стану же я делать запрос from t selec * where join order group ))) оно просто выполняться не будет...))) MasterZiv-- условия выборки пиши в WHERE -- условия JOIN-ов -- в JOIN-ах во фразе ON. Чтобы я эти правила стал выполнять, мне сначала важно понять какие потери мы несем при размещении условий выборок в джоин-секции MasterZiv-- используй параметры запросов. Не понял этот пункт вообще... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 18:51:21 |
|
||
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
Lumixкакие потери мы несем при размещении условий выборок в джоин-секцииДля OUTER JOIN-ов - изменение логики (и результата) запроса. Для INNER JOIN-ов - затруднение сопровождаемости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 19:05:44 |
|
||
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
miksoftLumixкакие потери мы несем при размещении условий выборок в джоин-секцииДля OUTER JOIN-ов - изменение логики (и результата) запроса. Можете привести какой-нибудь пример на пальцах? Вот тут по-вашему логика меняется или нет? Код: sql 1. 2. miksoftLumixкакие потери мы несем при размещении условий выборок в джоин-секцииДля INNER JOIN-ов - затруднение сопровождаемости. А это что имеется ввиду? Можете какой-нибудь пример на пальцах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 19:29:24 |
|
||
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
LumixМожете привести какой-нибудь пример на пальцах? Вот тут по-вашему логика меняется или нет? Код: sql 1. 2. Да, конечно, меняется. Тут условие where b.tit = 'some' фактически превращает left join в просто join. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 19:37:44 |
|
||
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
Lumixmiksoftпропущено... Для INNER JOIN-ов - затруднение сопровождаемости. А это что имеется ввиду? Можете какой-нибудь пример на пальцах?Другой разработчик, который потом будет читать этот запрос, имеет все основания полагать, что в секции WHERE он увидит все условия для фильтрации. И он не будет ожидать, что часть из них спряталась в секции FROM. Если это запрос строк эдак на 200, то это становится проблемой. А я и в пяти строчках могу ошибиться таким образом :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 19:40:34 |
|
||
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
miksoftLumixМожете привести какой-нибудь пример на пальцах? Вот тут по-вашему логика меняется или нет? Код: sql 1. 2. Да, конечно, меняется. Тут условие where b.tit = 'some' фактически превращает left join в просто join. Oк, согласен. А как насчет такого? Код: sql 1. 2. или вы хотите сказать, что как только мускул увидит условие a.tit = 'some', то он тут же сам включит inner?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 20:28:58 |
|
||
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
LumixА как насчет такого? Код: sql 1. 2. Эти запросы логически эквивалентны. Хотя второй из них имеет настолько непривычный вид, что вызывает отторжение. Lumixили вы хотите сказать, что как только мускул увидит условие a.tit = 'some', то он тут же сам включит inner??Нет, это только для "необязательной" стороны JOIN-а. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 20:32:44 |
|
||
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
miksoftLumixпропущено... А это что имеется ввиду? Можете какой-нибудь пример на пальцах?Другой разработчик, который потом будет читать этот запрос, имеет все основания полагать, что в секции WHERE он увидит все условия для фильтрации. И он не будет ожидать, что часть из них спряталась в секции FROM. Если это запрос строк эдак на 200, то это становится проблемой. А я и в пяти строчках могу ошибиться таким образом :) Практика показала, что ваши опасения надуманны. По крайней мере в нашем деле. Та опасность, о которой вы сейчас пишите, актуальна только для слепой разработки, то есть когда программист пишет код, тестят тестеры (другие люди), а юзают вообще третьи, то есть пользователи второго и третьего порядка. В нашем деле разработчики пишут не код, а продукт и поэтому они контроллируют не как у них работает код, а как у них работает полезная функция, то есть конечный продукт. И поэтому как показала практика, подобные опасения беспочвенны. Если они куда-то что-то вставят не так, то у них просто софт не будет работать как этого ожидает заказчик и они это увидят прямо во время разработки. PS. В наших проектах не существует запросов на 200 строк. Просто архитектура платформы так устроена, что подобные запросы физически никогда не требуются. К тому же наши разработчики практически не лазят в sql... Очень-очень редко, когда дело доходит до живого sql... Это очень-очень редко... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 20:34:28 |
|
||
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
miksoftLumixА как насчет такого? Код: sql 1. 2. Эти запросы логически эквивалентны. Хотя второй из них имеет настолько непривычный вид, что вызывает отторжение. Lumixили вы хотите сказать, что как только мускул увидит условие a.tit = 'some', то он тут же сам включит inner??Нет, это только для "необязательной" стороны JOIN-а. Ну вот, получается что вывод по этому пункту такой: я не вижу "криминала" в использовании условий в join-секции... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 20:36:06 |
|
||
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
LumixНу вот, получается что вывод по этому пункту такой: я не вижу "криминала" в использовании условий в join-секции...Ну если ваши разработчики не читают код SQL, то да, для вас этого "криминала" не существует. Но так не у всех. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 20:37:47 |
|
||
|
Ручной порядок
|
|||
|---|---|---|---|
|
#18+
miksoftLumixНу вот, получается что вывод по этому пункту такой: я не вижу "криминала" в использовании условий в join-секции...Ну если ваши разработчики не читают код SQL, то да, для вас этого "криминала" не существует. Но так не у всех. Читают они, читают. И платформа позволяет творить любые чудеса с чистым sql. Просто реально за много лет до сих пор не было ничего на 200 строк И много лет уже пользуемся простановкой условий в джоин-секции и пока "никто не умер")) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 21:27:18 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39077800&tid=1832609]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
79ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 222ms |
| total: | 365ms |

| 0 / 0 |
