Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как заставить FB использовать индекс / 25 сообщений из 40, страница 1 из 2
20.04.2017, 11:14
    #39441437
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить FB использовать индекс
К примеру, мне надо, чтобы при параметре 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
20.04.2017, 11:19
    #39441441
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить FB использовать индекс
rdb_devА если мне требуется три параметра -восемь запросов? Надо с этим что-то делать...

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

для начала попробуй на ФБ 3.0
...
Рейтинг: 0 / 0
20.04.2017, 11:39
    #39441462
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить FB использовать индекс
dimitr, дождусь уж 4.0 в июле, даст Бог... ;)
...
Рейтинг: 0 / 0
20.04.2017, 11:43
    #39441470
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить FB использовать индекс
тебе результат нужен или поговорить захотелось?
...
Рейтинг: 0 / 0
20.04.2017, 12:01
    #39441490
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить FB использовать индекс
dimitr, хотелось поговорить за результат на 2.5.
...
Рейтинг: 0 / 0
20.04.2017, 12:18
    #39441504
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить FB использовать индекс
или динамически формируй запрос, или делай UNION ALL
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.04.2017, 12:58
    #39441539
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить FB использовать индекс
Мимопроходящий, и обернуть это в SELECT DISTINCT? Вариант... Спасибо, попробую!
...
Рейтинг: 0 / 0
20.04.2017, 13:02
    #39441543
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить FB использовать индекс
rdb_devи обернуть это в SELECT DISTINCT?
Зачем? У тебя поле может быть NULL и NOT NULL одновременно?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.04.2017, 13:07
    #39441548
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить FB использовать индекс
Dimitry Sibiryakov, да, правильно! Обёртывать не надо, но всё равно кол-во объединенных запросов получается 2 в степени кол-ва параметров.
...
Рейтинг: 0 / 0
20.04.2017, 13:14
    #39441557
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить FB использовать индекс
Поправочка: 2 ** кол-во_параметров - 1
...
Рейтинг: 0 / 0
20.04.2017, 13:17
    #39441558
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить FB использовать индекс
rdb_devхотелось поговорить за результат на 2.5.
в 2.5 с этим уже никак. Оптимизатор строит план до prepare, соответственно, он не знает, что там будет, поэтому для такой конструкции индекс использовать в плане никак не может.
В 3.0 на такие конструкции в плане выдается пара
PLAN ... (table natural, table index (tableindex))
и "нужная часть плана выбирается в рантайме (при выполнении запроса)".
...
Рейтинг: 0 / 0
20.04.2017, 13:25
    #39441566
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить FB использовать индекс
В общем, получилось как то так:
Код: 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
20.04.2017, 13:29
    #39441572
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить FB использовать индекс
Hello, Rdb Dev!
You wrote on 20 апреля 2017 г. 13:32:08:

Rdb Dev> Ведь всё равно, по сути, выполняется четыре запроса на выборку, вместо одного.
статистику чтений смотри
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.04.2017, 13:37
    #39441578
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить FB использовать индекс
Мимопроходящий, статистика так себе... Индексы, конечно, используются, но при любом раскладе присутствует NIR в количестве строк таблицы.
...
Рейтинг: 0 / 0
20.04.2017, 14:40
    #39441642
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить FB использовать индекс
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
20.04.2017, 14:44
    #39441646
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить FB использовать индекс
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
20.04.2017, 14:50
    #39441652
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить FB использовать индекс
Мимопроходящий,

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
20.04.2017, 15:14
    #39441669
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить FB использовать индекс
Симонов Денис, забавно! :) И всё бы хорошо, но ФБ не понимает когда и какой индекс ему использовать. Пересчет статистики не помогает и в конечном счете ФБ переходит на выборку по PK при любых значениях параметров.
...
Рейтинг: 0 / 0
20.04.2017, 15:20
    #39441675
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить FB использовать индекс
rdb_dev,

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

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

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

я не разработчик но скажу. Нет не будет!
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как заставить FB использовать индекс / 25 сообщений из 40, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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