Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Запрос не использует индекс / 25 сообщений из 49, страница 1 из 2
24.03.2014, 08:17:57
    #38594156
mvb
mvb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
Таблица POLIS на 40 млн записей, в ней есть поле
Код: sql
1.
POLIS_NUM          DM_VS_NUM /* DM_VS_NUM = VARCHAR(20) */


по которому построен индекс
Код: sql
1.
CREATE INDEX POLIS_IDX6 ON POLIS (POLIS_NUM);


его статистика 0,0000005307737

Но простой запрос этот индекс не берет:
Код: sql
1.
2.
3.
SELECT * FROM POLIS WHERE POLIS_NUM=111202261

PLAN (POLIS NATURAL)


Что тут не так? Другое поле в этой же таблице с таким же индексом и статистикой 0,0000012724427, по нему ищет практически мгновенно..
...
Рейтинг: 0 / 0
24.03.2014, 08:20:21
    #38594158
mvb
mvb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
Server Version: WI-V2.5.2.26540 Firebird 2.5
Server Implementation: Firebird/x86-64/Windows NT
Service Version: 2

Работает как суперклассик. Но в суперсервере было то же самое..
...
Рейтинг: 0 / 0
24.03.2014, 08:27:25
    #38594160
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
mvbНо простой запрос этот индекс не берет:
Код: sql
1.
2.
3.
SELECT * FROM POLIS WHERE POLIS_NUM=111202261

PLAN (POLIS NATURAL)

Апострофы добавь к значению, которое ищешь.
...
Рейтинг: 0 / 0
24.03.2014, 08:30:36
    #38594163
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
mvbНо простой запрос этот индекс не берет
когда ищешь число в строковом поле, это неудивительно
...
Рейтинг: 0 / 0
24.03.2014, 08:33:10
    #38594164
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
dimitr,

я правильно понимать, что оптимизатор будет вот такое искать:
Код: sql
1.
select * from t where cast(polis_num as varchar(20))=cast(111202261 as varchar(20));

- ?

И если да, то... зачем ему делать cast к варчару поля, которое и так варчар ?
...
Рейтинг: 0 / 0
24.03.2014, 08:36:39
    #38594165
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
Таблоид,

я не понимаю твой вопрос. Оптимизатор всего навсего проверяет совместимость типов. Так что достаточно каста в правой части. Либо правильно задать искомый литерал.
...
Рейтинг: 0 / 0
24.03.2014, 08:39:30
    #38594168
mvb
mvb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
Таблоид,

спасибо, думал сервер сам конвертит...
...
Рейтинг: 0 / 0
24.03.2014, 08:43:16
    #38594172
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
dimitrТаблоид,

я не понимаю твой вопрос. Оптимизатор всего навсего проверяет совместимость типов. Так что достаточно каста в правой части. Либо правильно задать искомый литерал.Ну, вот забыли литерал задать правильно, и оптимизатор увидел несовместимость типов.
К чему в итоге будет преобразован where-предикат:
Код: plaintext
cast( поле as T) = cast( ключ as T ), где T = <общий_тип_к_которому_можно_преобразовать>
- к чему-то подобному ?
...
Рейтинг: 0 / 0
24.03.2014, 09:00:10
    #38594184
m7m
m7m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
ТаблоидНу, вот забыли литерал задать правильно, и оптимизатор увидел несовместимость типов.
К чему в итоге будет преобразован where-предикат:
Код: plaintext
cast( поле as T) = cast( ключ as T ), где T = <общий_тип_к_которому_можно_преобразовать>
- к чему-то подобному ?

Насколько я помню если одно из полей Numeric то будет преобразовывать к Numeric
Между Varchar и Date отдаст предпочтение Varchar
...
Рейтинг: 0 / 0
24.03.2014, 09:02:38
    #38594186
m7m
m7m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
Таблоид
я правильно понимать, что оптимизатор будет вот такое искать:
Код: sql
1.
select * from t where cast(polis_num as varchar(20))=cast(111202261 as varchar(20));

- ?

И если да, то... зачем ему делать cast к варчару поля, которое и так варчар ?
Он будет искать
Код: sql
1.
select * from t where cast(polis_num as integer)=111202261;
...
Рейтинг: 0 / 0
24.03.2014, 09:03:09
    #38594188
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
m7mНасколько я помню если одно из полей Numeric то будет преобразовывать к Numeric
Между Varchar и Date отдаст предпочтение Varcharа, понятно: он вместо преобразования ключа к варчару стал преобразовывать поле к числу.
...
Рейтинг: 0 / 0
24.03.2014, 09:03:41
    #38594189
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
тьфу, не успел я со своей "догадкой века" :-)
...
Рейтинг: 0 / 0
24.03.2014, 09:39:25
    #38594214
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
феерия какая-то началась, ей богу...

ТаблоидНу, вот забыли литерал задать правильно, и оптимизатор увидел несовместимость типов.
К чему в итоге будет преобразован where-предикат
нафига его вообще преобразовывать?
...
Рейтинг: 0 / 0
24.03.2014, 09:53:44
    #38594224
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
Забавный у вас топик. :)

P.S. Если ты помнишь, я как-то предлагал сделать общую таблицу
приведений типов и вывесить её (тут или на ibase, неважно), чтобы
не приходилось объяснять каждый раз, а просто ткнуть.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.03.2014, 11:37:45
    #38594337
NickDee
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
А сравнивать числа со строками - это полезно?
Т.е. это полезная фича движка? Или это больше пространство для ошибок, типа описанной в первом посте?
...
Рейтинг: 0 / 0
24.03.2014, 12:06:57
    #38594362
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
dimitrфеерия какая-то началась, ей богу...ТаблоидНу, вот забыли литерал задать правильно, и оптимизатор увидел несовместимость типов. К чему в итоге будет преобразован where-предикатнафига его вообще преобразовывать?В данном примере тип литерала не соотв-вует типу поля, и это послужило причиной смена плана на натурал. Мой вопрос на самом деле такой: почему движок начинает искать по условию where cast( field as <literal_type) = <literal>, а не так: where field = cast(literal as <field_type>) ?
...
Рейтинг: 0 / 0
24.03.2014, 12:12:40
    #38594367
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
Таблоид,

потому что сравнить число со строкой можно исключительно преобразованием строки к числу, а не наоборот. Причину я тут уже неоднократно объяснял. Так и в оракле, и в других СУБД тоже.
...
Рейтинг: 0 / 0
24.03.2014, 12:27:54
    #38594384
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
dimitr> сравнить число со строкой можно исключительно
dimitr> преобразованием строки к числу, а не наоборот

Вообще-то это не совсем так или даже совсем не так,
и ты это прекрасно знаешь. Как делается в других
СУБД, как прописано в стандарте и пр. - другой
вопрос, но в очевидном случае с integer-ом можно
было бы и добавить дополнительное условие, если
бы сам сабжевый случай не был идиотским, конечно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.03.2014, 12:33:20
    #38594397
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
Гаджимурадов РустамВообще-то это не совсем так или даже совсем не так, и ты это прекрасно знаешь
я знаю, что сравнить можно неправильно, а можно правильно. Строковых представлений одного и того же числа множество, поэтому преобразовывать в строку при сравнении неправильно. Тоже самое с датой/временем.
...
Рейтинг: 0 / 0
24.03.2014, 12:36:55
    #38594407
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
dimitr> Строковых представлений одного и того же числа множество
dimitr> Тоже самое с датой/временем.

Мы говорим сугубо про integer, так что дату и время сюда
притягивать не нужно. А у integer-а строковых представлений
ровно одно нормальное и распространённое - экзотику типа
ведущего нуля, знака и 1,e+10 обсуждать смысла не вижу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.03.2014, 12:38:02
    #38594409
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
Гаджимурадов Рустам,

про экзотику в виде знака это ты математикам расскажи :-)
...
Рейтинг: 0 / 0
24.03.2014, 12:41:42
    #38594414
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
даже если экзотику не рассматривать, я затрудняюсь объяснить, почему из 1 = '1' и 1.0 = '1.0' и 1 = 1.0 не должно следовать равенство 1 = '1.0' или 1.0 = '1'
...
Рейтинг: 0 / 0
24.03.2014, 14:02:35
    #38594571
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
dimitr> про экзотику в виде знака это ты математикам расскажи :-)

Знак я имел в виду плюс, а не минус. С минусом понятно.
А несогласных математиков зови сюда, объясним популярно,
сами тоже не гуманитарии.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.03.2014, 14:05:29
    #38594581
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
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
...
Рейтинг: 0 / 0
24.03.2014, 14:07:26
    #38594583
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не использует индекс
В-четвёртых, одно (и самое главное) спасает - на самом деле,
мы тут проблему из пальца высасываем, ибо знаючи полагаться
на неявное приведение, особенно как в сабжевом примере,
будут только аристократы и эти самые.

Так что забей.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Запрос не использует индекс / 25 сообщений из 49, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]