powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Запрос не использует индекс
25 сообщений из 49, страница 1 из 2
Запрос не использует индекс
    #38594156
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
Запрос не использует индекс
    #38594158
mvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Server Version: WI-V2.5.2.26540 Firebird 2.5
Server Implementation: Firebird/x86-64/Windows NT
Service Version: 2

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

PLAN (POLIS NATURAL)

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

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

- ?

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

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

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

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

Насколько я помню если одно из полей Numeric то будет преобразовывать к Numeric
Между Varchar и Date отдаст предпочтение Varchar
...
Рейтинг: 0 / 0
Запрос не использует индекс
    #38594186
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
Запрос не использует индекс
    #38594188
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7mНасколько я помню если одно из полей Numeric то будет преобразовывать к Numeric
Между Varchar и Date отдаст предпочтение Varcharа, понятно: он вместо преобразования ключа к варчару стал преобразовывать поле к числу.
...
Рейтинг: 0 / 0
Запрос не использует индекс
    #38594189
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тьфу, не успел я со своей "догадкой века" :-)
...
Рейтинг: 0 / 0
Запрос не использует индекс
    #38594214
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
феерия какая-то началась, ей богу...

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

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

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

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

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

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

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

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


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