Задавайте вопросы, мы ответим
Вы не зашли.
Прошу помощи. Запутался в двух соснах.
Есть таблица, для упрощения с одним полем ID
Отредактированно klow (25.01.2017 15:27:48)
Неактивен
оптимизатор не учитывает функции
не умеет - такое ограничение
видимо, по этой причине и выдает такой странный план
хотя в данном случае, имхо, можно говорить о баге
Неактивен
vasya написал:
можно говорить о баге
Плохо, я надеялся, что сам что-то нахомутал.
У меня MySql 5.5.54. Интересно на других версиях что?
Неактивен
проверил в 5.7.9, то же самое
Неактивен
Неужели раньше никто не наступал на эти грабли?
Отредактированно klow (25.01.2017 16:05:46)
Неактивен
наверное, плакали, кололись, но продолжали жевать кактус
можно использовать обходные пути, например, сначала вычислять значение через функцию и подставлять его константой
Неактивен
1. Не могу использовать символ @. В клиенте MySql для Net он используется для переменных.
2. В одном запросе может быть много обращений к этой функции.
Отредактированно klow (25.01.2017 16:26:51)
Неактивен
Попробуйте добавить DETERMINISTIC к CREATE FUNCTION. Если функция недетерминистичная, MySQL может думать, что она меняется и вычислять ее для каждой строки.
Если не поможет, то нужно постить багу.
Неактивен
Спасибо! При DETERMINISTIC использует индекс. Но меня это не спасает. У меня реальная функция NOT DETERMINISTIC.
rgbeast написал:
Если функция недетерминистичная, MySQL может думать, что она меняется и вычислять ее для каждой строки.
Похоже, что именно так.
Отредактированно klow (26.01.2017 00:18:19)
Неактивен
На что влияет "READS SQL DATA"? Какой в нем смысл?
Отредактированно klow (26.01.2017 00:35:32)
Неактивен
"READS SQL DATA" означает, что функция содержит SELECT, но не UPDATE и DELETE. Эта характеристика может использоваться оптимизатором, но с примерами ее работы не сталкивался.
Про пользовательские переменные в .net попробуйте как здесь рекомендуют:
http://blog.tjitjing.com/index.php/2009 … fined.html
Неактивен
Еще как вариант попробуйте заменить JOIN на JOIN t1 с результатом подзапроса из t2. Индексы на t1 будут использованы, если подзапрос будет считаться независимым.
Неактивен
rgbeast написал:
Про пользовательские переменные в .net попробуйте как здесь рекомендуют:
http://blog.tjitjing.com/index.php/2009 … fined.html
С эти знаком. Но у меня очень много запросов, переписывать их всех еще тот геморой. Заводить отдельное соединение для данного запроса тоже не очень хороший вариант.
Неактивен
rgbeast написал:
Еще как вариант попробуйте заменить JOIN на JOIN t1 с результатом подзапроса из t2. Индексы на t1 будут использованы, если подзапрос будет считаться независимым.
не уловил смыл. Большой разницы, думаю, не будет так ка для t2.id=GetId() будет перебор всех значений из t2.
У меня есть другая идея, проверю - по результатам отпишусь.
Отредактированно klow (26.01.2017 10:52:13)
Неактивен
Результаты моего эксперимента.
Изменил функцию
Отредактированно klow (26.01.2017 11:45:56)
Неактивен
неужели ни кто не прокомментирует мои испытания, которые, вроде как, противоречат документации MySql. Что я не так сделал?
Неактивен
klow написал:
Добавляем одну (несколько) записей в таблицу.
И снова запускаем скрипт. Так как функция GetId DETERMINISTIC ожидается что скрипт возвратит строку, что и в первый раз.
Это неверное суждение.
Детерминированные ф-ии возвращают один и тот же результат, если предоставлять им один и тот же набор входных значений и использовать одно и то же состояние базы данных.
Иными словами, многократное выполнение ф-ии даст один и тот же результат до тех пор, пока вы не изменили данные.
P.S. Кроме того, в доке сказано, что можно указывать DETERMINISTIC для не детерминированных ф-ий и наоборот, но в этом случае будете сам себе злобный буратина.
MySQL does not check that a routine declared DETERMINISTIC is free of statements that produce nondeterministic results. However, misdeclaring a routine might affect results or affect performance. Declaring a nondeterministic routine as DETERMINISTIC might lead to unexpected results by causing the optimizer to make incorrect execution plan choices. Declaring a deterministic routine as NONDETERMINISTIC might diminish performance by causing available optimizations not to be used.
Неактивен
Спасибо!
vasya написал:
Это неверное суждение.
Это неверное суждение было основано на
значит оно тоже является неверным?!
Неактивен
Надпись на двери: Заседание клуба педантов пройдет здесь.
Она верная или нет?
Ведь, на самом деле - не здесь, а в помещении за этой дверью (но обычно так никто не пишет).
Так же и с процитированным вами утверждением. Оно верное, но на заседании клуба педантов его раскритикуют за неполноту.
Неактивен
Я Вас понял, но, думаю, в данном случае, именно это уточнение, которое Вы ранее привели, было бы очень важно для этого утверждения. Ведь существенно меняться смысл.
Но не суть, я понял, еще раз спасибо!
Правда, жаль других пользователей, которые могут его воспринять буквально и наступят на те-же грабли.
Отредактированно klow (05.02.2017 09:28:31)
Неактивен
klow, мне кажется, что наиболее важно то, что слово в описании DETERMINISTIC не влияет на поведение функции, а влияет лишь на оптимизатор. Ошибки на совести автора функции.
Что касается определения, то в документации написано, что зависит только от аргументов. Однако обычно это свойство используется при репликации. В последнем случае данные в таблицах тоже идентичны, поэтому широкая трактовка (как предлагает vasya) вполне допустима. Думаю, что это бага документации.
См. также обсуждение на Stack Overflow:
http://stackoverflow.com/questions/7946 … n-in-mysql
Неактивен
Запостил багу документации:
https://bugs.mysql.com/bug.php?id=84822
Нажмите "Affects me" в багтрекере
Неактивен