powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как заставить FB использовать индекс
40 сообщений из 40, показаны все 2 страниц
Как заставить FB использовать индекс
    #39441437
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К примеру, мне надо, чтобы при параметре IS NULL выбирались все записи таблицы, а при IS NOT NULL только соответствующие значению параметра. Оба следующих варианта на 2.5.7 не используют индекс принципиально:
Код: sql
1.
2.
3.
SELECT *
  FROM myTable
  WHERE NOT(Cast(:groupId AS INTEGER) IS NOT NULL AND group_id != :groupId)

или
Код: sql
1.
2.
3.
SELECT *
  FROM myTable
  WHERE Cast(:groupId AS INTEGER) IS NULL OR group_id = :groupId

Хорошо, если мне требуется отбор по одному параметру - я могу сделать в ХП два запроса, выполняемых по условию IF (:groupId IS NOT NULL) THEN... А если мне требуется три параметра -восемь запросов? Надо с этим что-то делать...
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441441
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devА если мне требуется три параметра -восемь запросов? Надо с этим что-то делать...

Да, надо править консерваторию. Например, исключить из картины SP.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441449
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, то есть посылать серверу собранный на клиенте запрос? А как быть с подобными запросами (ХП), вызываемыми из других ХП? Собирать запрос в строку и делать EXECUTE STATEMENT внутри FOR? Чот фигня какая-то... Может лучше научить сервер использовать индекс не только с одиночным предикатом "равно"?
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441453
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

для начала попробуй на ФБ 3.0
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441462
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr, дождусь уж 4.0 в июле, даст Бог... ;)
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441470
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тебе результат нужен или поговорить захотелось?
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441490
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr, хотелось поговорить за результат на 2.5.
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441504
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или динамически формируй запрос, или делай UNION ALL
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441539
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий, и обернуть это в SELECT DISTINCT? Вариант... Спасибо, попробую!
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441543
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devи обернуть это в SELECT DISTINCT?
Зачем? У тебя поле может быть NULL и NOT NULL одновременно?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441548
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, да, правильно! Обёртывать не надо, но всё равно кол-во объединенных запросов получается 2 в степени кол-ва параметров.
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441557
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправочка: 2 ** кол-во_параметров - 1
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441558
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devхотелось поговорить за результат на 2.5.
в 2.5 с этим уже никак. Оптимизатор строит план до prepare, соответственно, он не знает, что там будет, поэтому для такой конструкции индекс использовать в плане никак не может.
В 3.0 на такие конструкции в плане выдается пара
PLAN ... (table natural, table index (tableindex))
и "нужная часть плана выбирается в рантайме (при выполнении запроса)".
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441566
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, получилось как то так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT *
  FROM myTable
  WHERE Cast(:param1 AS INTEGER) IS NULL
    AND Cast(:param2 AS INTEGER) IS NULL
UNION ALL
SELECT *
  FROM myTable
  WHERE Cast(:param1 AS INTEGER) IS NULL
    AND Cast(:param2 AS INTEGER) IS NOT NULL AND field2 = :param2
UNION ALL
SELECT *
  FROM myTable
  WHERE Cast(:param1 AS INTEGER) IS NOT NULL AND field1 = :param1
    AND Cast(:param2 AS INTEGER) IS NULL
UNION ALL
SELECT *
  FROM myTable
  WHERE Cast(:param1 AS INTEGER) IS NOT NULL AND field1 = :param1
    AND Cast(:param2 AS INTEGER) IS NOT NULL AND field2 = :param2

Оно того стоит? Ведь всё равно, по сути, выполняется четыре запроса на выборку, вместо одного.
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441572
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Rdb Dev!
You wrote on 20 апреля 2017 г. 13:32:08:

Rdb Dev> Ведь всё равно, по сути, выполняется четыре запроса на выборку, вместо одного.
статистику чтений смотри
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441578
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий, статистика так себе... Индексы, конечно, используются, но при любом раскладе присутствует NIR в количестве строк таблицы.
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441642
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

Таблоид это делал вот так

Код: sql
1.
2.
3.
4.
5.
SELECT *
FROM myTable
WHERE 
     field1 BETWEEN (:param1, –2147483648) AND (:param1, 2147483647)
  AND field2 BETWEEN (:param2, –2147483648) AND (:param2, 2147483647)
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441646
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Симонов Денис!
You wrote on 20 апреля 2017 г. 14:47:16:

Симонов Денисfield1 BETWEEN (:param1, –2147483648) AND (:param1, 2147483647)ты чо-то напутал
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441652
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

COALESCE забыл

Код: sql
1.
2.
3.
4.
5.
SELECT *
FROM myTable
WHERE 
     field1 BETWEEN COALESCE (:param1, -2147483648) AND COALESCE (:param1, 2147483647)
  AND field2 BETWEEN COALESCE (:param2, -2147483648) AND COALESCE (:param2, 2147483647)
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441669
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, забавно! :) И всё бы хорошо, но ФБ не понимает когда и какой индекс ему использовать. Пересчет статистики не помогает и в конечном счете ФБ переходит на выборку по PK при любых значениях параметров.
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441675
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

так выборка по PK всегда наиболее оптимальна
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441691
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, неа. Если в качестве параметра, с которым сравнивается поле с PK, передаешь NULL, то в выборку по PK попадают все записи и оптимальным, в этом случае, будет использование индекса по второму полю, сравнивающееся со вторым параметром (если он не NULL).
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441695
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые разработчики, NullIf() в ФБ3 или ФБ4 будет использовать индексы? Думал так выкрутится:
Код: sql
1.
WHERE NullIf(Cast(:param1 AS INTEGER), field1) IS NULL

не получилось.
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441701
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

ту уже определись тебе надо при использовании NULL показывать все записи или ни одной. Думать надо, а не тупо копировать советы. Этот способ вполне себе годиться для отдельных случаев. Что именно там у тебя отсюда не видно, поскольку ты привёл какой-то абстрактный запрос
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441703
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

я не разработчик но скажу. Нет не будет!
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441712
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисту уже определись тебе надо при использовании NULL показывать все записи или ни одной.Посмотри повнимательнее на условие в WHERE 20419222 . Если param1 IS NULL, будут выбраны все записи, если NOT NULL - только те, что соответствуют условию field1 = param1.
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441723
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денися не разработчик но скажу. Нет не будет!Неужели так сложно научить NullIf() пользоваться индексом по полю таблицы, заданному в Expression2 ?
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441725
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

а почему nullif? А чем другие функции провинились? Прочитай уже статью про методы доступа
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441727
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Дениса почему nullif? А чем другие функции провинились? Прочитай уже статью про методы доступаЕсли попутно Iif() научат, то я только за! Другие функции, использующие сравнение значений, как-то не всплыли в памяти. Они есть?
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39441750
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devНеужели так сложно научить NullIf() пользоваться индексом по полю таблицы, заданному в Expression2 ?Ты ставишь телегу впереди лошади.
Сначала нужно прочитать запись, а уже потом к ней можно применить ф-цию.
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39442038
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad, телегу бы я ставил впереди лошади, если бы функции NullIf() и Iif() были реализованы отдельно от сервера - в виде UDF, к примеру.
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39442052
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисМимопроходящий, COALESCE забыл
Код: sql
1.
2.
3.
4.
5.
SELECT *
FROM myTable
WHERE 
     field1 BETWEEN COALESCE (:param1, -2147483648) AND COALESCE (:param1, 2147483647)
  AND field2 BETWEEN COALESCE (:param2, -2147483648) AND COALESCE (:param2, 2147483647)


В общем, удалось добиться нужного результата, но для этого понадобилось состряпать план запроса вручную , что-то типа этого:
Код: sql
1.
2.
3.
4.
5.
SELECT *
  FROM myTable
  WHERE field1 BETWEEN COALESCE (:param1, -2147483648) AND COALESCE (:param1, 2147483647)  -- myTable__pk
    AND field2 BETWEEN COALESCE (:param2, -2147483648) AND COALESCE (:param2, 2147483647)
  PLAN JOIN (myTable INDEX (myTable__pk, myTable__fk__field2))

В этом случае получаем оптимальное количество индексных чтений при любой комбинации параметров. Странно, что сервер самостоятельно не способен выбрать такой план.
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39442054
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

план то кривой до безобразия. Он вообще неработоспособный. Что у тебя там за JOIN? С чем он?
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39442064
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, забыл удалить JOIN. В чем, конкретно, кривизна плана, если этот план работает лучше, чем тот, что предлагает сервер?
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39442077
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devhvlad, телегу бы я ставил впереди лошади, если быу тебя была телега. И лошадь.

Включи мозг и перестань болтать ерундой (ц)
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39442080
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvВ 3.0 на такие конструкции в плане выдается пара
PLAN ... (table natural, table index (tableindex))
и "нужная часть плана выбирается в рантайме (при выполнении запроса)".
А в RN от тройки явного упоминания именно такого поведения нет.
Это вот оно?
Firebird-3.0.2-ReleaseNotes.pdfOR'ed Parameter in WHERE Clause
Dmitry Yemanov
Performance for (table.field = :param or :param = -1) in the WHERE clause was enhanced
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39442081
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgm,

это оно и есть
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39442084
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,
Вроде как не рекомендуется использовать свой PLAN. Firebird умнее нас, анализирует данные перед запросом.
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39442087
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI, обсуждаемый explain прост до безобразия. Что мешает тебе проверить своё утверждение?
...
Рейтинг: 0 / 0
Как заставить FB использовать индекс
    #39442196
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIВроде как не рекомендуется использовать свой PLAN.
свой, не свой. Если явно указать план от 3.0 для 2.5, для этого случая, то ФБ 2.5 выматерится. Я же ясно объяснил, как "оптимизируется" данная ситуация. Хочется превратить 2.5 в 3.0? Увы, это можно сделать только установкой 3.0.
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как заставить FB использовать индекс
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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