|
|
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
Таблица POLIS на 40 млн записей, в ней есть поле Код: sql 1. по которому построен индекс Код: sql 1. его статистика 0,0000005307737 Но простой запрос этот индекс не берет: Код: sql 1. 2. 3. Что тут не так? Другое поле в этой же таблице с таким же индексом и статистикой 0,0000012724427, по нему ищет практически мгновенно.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 08:17:57 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
Server Version: WI-V2.5.2.26540 Firebird 2.5 Server Implementation: Firebird/x86-64/Windows NT Service Version: 2 Работает как суперклассик. Но в суперсервере было то же самое.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 08:20:21 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
mvbНо простой запрос этот индекс не берет: Код: sql 1. 2. 3. Апострофы добавь к значению, которое ищешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 08:27:25 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
mvbНо простой запрос этот индекс не берет когда ищешь число в строковом поле, это неудивительно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 08:30:36 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
dimitr, я правильно понимать, что оптимизатор будет вот такое искать: Код: sql 1. - ? И если да, то... зачем ему делать cast к варчару поля, которое и так варчар ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 08:33:10 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
Таблоид, я не понимаю твой вопрос. Оптимизатор всего навсего проверяет совместимость типов. Так что достаточно каста в правой части. Либо правильно задать искомый литерал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 08:36:39 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
Таблоид, спасибо, думал сервер сам конвертит... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 08:39:30 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
dimitrТаблоид, я не понимаю твой вопрос. Оптимизатор всего навсего проверяет совместимость типов. Так что достаточно каста в правой части. Либо правильно задать искомый литерал.Ну, вот забыли литерал задать правильно, и оптимизатор увидел несовместимость типов. К чему в итоге будет преобразован where-предикат: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 08:43:16 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
ТаблоидНу, вот забыли литерал задать правильно, и оптимизатор увидел несовместимость типов. К чему в итоге будет преобразован where-предикат: Код: plaintext Насколько я помню если одно из полей Numeric то будет преобразовывать к Numeric Между Varchar и Date отдаст предпочтение Varchar ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 09:00:10 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
Таблоид я правильно понимать, что оптимизатор будет вот такое искать: Код: sql 1. - ? И если да, то... зачем ему делать cast к варчару поля, которое и так варчар ? Он будет искать Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 09:02:38 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
m7mНасколько я помню если одно из полей Numeric то будет преобразовывать к Numeric Между Varchar и Date отдаст предпочтение Varcharа, понятно: он вместо преобразования ключа к варчару стал преобразовывать поле к числу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 09:03:09 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
тьфу, не успел я со своей "догадкой века" :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 09:03:41 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
феерия какая-то началась, ей богу... ТаблоидНу, вот забыли литерал задать правильно, и оптимизатор увидел несовместимость типов. К чему в итоге будет преобразован where-предикат нафига его вообще преобразовывать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 09:39:25 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
Забавный у вас топик. :) P.S. Если ты помнишь, я как-то предлагал сделать общую таблицу приведений типов и вывесить её (тут или на ibase, неважно), чтобы не приходилось объяснять каждый раз, а просто ткнуть. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 09:53:44 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
А сравнивать числа со строками - это полезно? Т.е. это полезная фича движка? Или это больше пространство для ошибок, типа описанной в первом посте? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 11:37:45 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
dimitrфеерия какая-то началась, ей богу...ТаблоидНу, вот забыли литерал задать правильно, и оптимизатор увидел несовместимость типов. К чему в итоге будет преобразован where-предикатнафига его вообще преобразовывать?В данном примере тип литерала не соотв-вует типу поля, и это послужило причиной смена плана на натурал. Мой вопрос на самом деле такой: почему движок начинает искать по условию where cast( field as <literal_type) = <literal>, а не так: where field = cast(literal as <field_type>) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 12:06:57 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
Таблоид, потому что сравнить число со строкой можно исключительно преобразованием строки к числу, а не наоборот. Причину я тут уже неоднократно объяснял. Так и в оракле, и в других СУБД тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 12:12:40 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
dimitr> сравнить число со строкой можно исключительно dimitr> преобразованием строки к числу, а не наоборот Вообще-то это не совсем так или даже совсем не так, и ты это прекрасно знаешь. Как делается в других СУБД, как прописано в стандарте и пр. - другой вопрос, но в очевидном случае с integer-ом можно было бы и добавить дополнительное условие, если бы сам сабжевый случай не был идиотским, конечно. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 12:27:54 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов РустамВообще-то это не совсем так или даже совсем не так, и ты это прекрасно знаешь я знаю, что сравнить можно неправильно, а можно правильно. Строковых представлений одного и того же числа множество, поэтому преобразовывать в строку при сравнении неправильно. Тоже самое с датой/временем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 12:33:20 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
dimitr> Строковых представлений одного и того же числа множество dimitr> Тоже самое с датой/временем. Мы говорим сугубо про integer, так что дату и время сюда притягивать не нужно. А у integer-а строковых представлений ровно одно нормальное и распространённое - экзотику типа ведущего нуля, знака и 1,e+10 обсуждать смысла не вижу. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 12:36:55 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов Рустам, про экзотику в виде знака это ты математикам расскажи :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 12:38:02 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
даже если экзотику не рассматривать, я затрудняюсь объяснить, почему из 1 = '1' и 1.0 = '1.0' и 1 = 1.0 не должно следовать равенство 1 = '1.0' или 1.0 = '1' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 12:41:42 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
dimitr> про экзотику в виде знака это ты математикам расскажи :-) Знак я имел в виду плюс, а не минус. С минусом понятно. А несогласных математиков зови сюда, объясним популярно, сами тоже не гуманитарии. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 14:02:35 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
dimitr> почему из 1 = '1' и 1.0 = '1.0' и 1 = 1.0 не должно dimitr> следовать равенство 1 = '1.0' или 1.0 = '1' Во-первых, потому что 1ю0 - это нифига не integer (внезапно ), во-вторых, не знаю, зачем ты тут такие "сложные" уравнения выводишь, когда речь идёт об одном, а не двух-трёх, в-третьих, про 1.0 = 1.0 - это хорошо, это пять. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 14:05:29 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
В-четвёртых, одно (и самое главное) спасает - на самом деле, мы тут проблему из пальца высасываем, ибо знаючи полагаться на неявное приведение, особенно как в сабжевом примере, будут только аристократы и эти самые. Так что забей. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 14:07:26 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов Рустамна неявное приведение, особенно как в сабжевом примере, будут только аристократы и эти самые. Вот для "этих самых" Таблоид и создал свой топик. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 14:13:12 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
Который вопросы и ответы? :) Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 14:37:46 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов РустамКоторый вопросы и ответы? :)yes, it is ! :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 14:48:04 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов РустамВо-первых, потому что 1ю0 - это нифига не integer (внезапно я полагаю, что использовать уникальность int для его кастования в строку при сравнении со строкой, вместо всех остальных случаев кастования строки к типу столбца, является некошерным. Также полагаю, что dimitr именно это и имел в виду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 16:59:51 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
kdv> я полагаю ... является некошерным Некошерность как определяется, на глаз? Или "я полагаю"-стью аргументы и ограничатся? Мнение ДЕ итак сто лет уже известно, просто не надо, как иногда бывает, делать вид, что по вопросу всего одно единственное мнение и оно и только оно правильное и кошерное. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 19:37:25 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов РустамНекошерность как определяется, на глаз? нет, исключительно так: field = value. во всех случаях (как я понял) value преобразуется к типу field. Ты же предлагаешь (опять же, насколько я понял) только для int (!) field преобразовывать к value. Налицо "двойные стандарты", которые в перспективе могут привести к глюкам в коде (нечитаемость, тут рыбу заворачивали, и т.п.) и функционале. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 20:33:41 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
kdvво всех случаях (как я понял) value преобразуется к типу field . Ты же предлагаешь (опять же, насколько я понял) только для int (!) field преобразовывать к value. Налицо "двойные стандарты", которые в перспективе могут привести к глюкам в коде (нечитаемость, тут рыбу заворачивали, и т.п.) и функционале.Всё наоборот! При указании литерала, тип которого отличается от varchar-поля, ЭТО САМОЕ ПОЛЕ преобразуется к типу литерала. Оттого и план меняется на natural. Рустам говорит (и я с ним согласен), что когда литерал есть целое число, то тут можно однозначно его интерпретировать и вместо where cast(field as int) = :literal сделать обратное - where field = cast(:literal as varchar(NN)). Такое сравнение (варчар полей с целыми числами) настолько часто, что можно было бы сделать исключение для этого случая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 20:41:47 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
Таблоидможно было бы сделать исключение для этого случая фсад ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 20:49:10 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
Таблоид> Такое сравнение (варчар полей с целыми числами) настолько часто И вот именно тут ты категорически неправ. Смотри "в-четвёртых". Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 21:13:02 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
ТаблоидВсё наоборот! При указании литерала, тип которого отличается от varchar-поля, ЭТО САМОЕ ПОЛЕ преобразуется к типу литерала. непорядок... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 21:17:10 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
kdv> непорядок... Ф сад. (с) Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 21:22:13 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов РустамСмотри "в-четвёртых". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 21:26:56 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
(сдавленным голосом из сада) Но ведь такие ошибки - их весьма трудно обнаружить среди сотен строк полезнейшего кода. Стейтменты вида select ... from contragents_ref where inn = 7755092124 (без апострофов) - они настолько хорошо "мимикрируют" при просмотре, что на это будет налетать еще много народу. Тип поля надо постоянно в башке держать :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 21:31:30 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
Таблоид(сдавленным голосом из сада) Но ведь такие ошибки - их весьма трудно обнаружить среди сотен строк полезнейшего кода. Стейтменты вида select ... from contragents_ref where inn = 7755092124 (без апострофов) - они настолько хорошо "мимикрируют" при просмотре, что на это будет налетать еще много народу. Тип поля надо постоянно в башке держать :( Тогда надо попросить соответствующие предупреждения при компиляции процедур, ну так я думаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 21:59:30 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
ТаблоидСтейтменты вида select ... from contragents_ref where inn = 7755092124 (без апострофов) - они настолько хорошо "мимикрируют" при просмотре, что на это будет налетать еще много народу. Тип поля надо постоянно в башке держать :( если программист, работая с ИНН, не способен удержать у себя в голове, что это строка а не число - то это не лечится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 22:41:12 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
dimitr, а причем тут именно " ИНН " ? это эе только для наглядности изложения приведено :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 22:43:51 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
Одно дело, когда человек знает, как работает :date = :varchar, и пишет так (типа я знаю как эта фича работает, а отальные мне побарабану). А другое дело, когда человек при компиляции такого видит ошибку, и поэтому пишет :date = date :varchar, и оно предсказуемым образом работает и понятно для всех. В конечном итоге полезным было бы иметь проверку типов при компиляции. Как ни крути :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2014, 03:55:30 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
m7mТогда надо попросить соответствующие предупреждения при компиляции процедур, ну так я думаюВ соседнем подразделе у Хвастунова? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2014, 10:03:51 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
Ivan_Pisarevskym7mТогда надо попросить соответствующие предупреждения при компиляции процедур, ну так я думаюВ соседнем подразделе у Хвастунова? Ну таки да ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2014, 10:27:57 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
Во весь спор не вникал, но, что первое бросается в глаза: запрос Код: plsql 1. совсем не одно и то же, что Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2014, 10:35:33 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
Кроме того, никто вообще не использует параметры ? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2014, 10:52:29 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
stelvicВо весь спор не вникал, но, что первое бросается в глаза: запрос Код: plsql 1. совсем не одно и то же, что Код: plsql 1. Спорили выше в том числе и про это. m7mНу таки даБудешь гонцом? ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2014, 11:25:52 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
Ivan_Pisarevskym7mНу таки даБудешь гонцом? ;) Предупреждения о "несоответствии" типов в операциях сравнения при компиляции процедур ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2014, 14:08:28 |
|
||
|
Запрос не использует индекс
|
|||
|---|---|---|---|
|
#18+
Таблоид(сдавленным голосом из сада) Но ведь такие ошибки - их весьма трудно обнаружить среди сотен строк полезнейшего кода. Стейтменты вида select ... from contragents_ref where inn = 7755092124 (без апострофов) - они настолько хорошо "мимикрируют" при просмотре, что на это будет налетать еще много народу. Тип поля надо постоянно в башке держать :( Это как писать. Если с детства не приучили к венгерской нотации - будешь мучаться всю... карьеру. В моем коде ни в жисть не ошибешься: Код: sql 1. про параметры: Код: sql 1. 2. 3. уже при написании будет "дискомфорт" Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2014, 15:15:32 |
|
||
|
|

start [/forum/topic.php?all=1&fid=40&tid=1563783]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
189ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
75ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 503ms |

| 0 / 0 |
