Начало » Использование СУБД » Firebird, HQbird, InterBase » Ненужные сканы записей при rows
Ненужные сканы записей при rows [сообщение #5911] |
Fri, 21 February 2025 12:49  |
marcodor
Сообщений: 8 Зарегистрирован: June 2022
|
Junior Member |
|
|
Добрый день,
Имеем такой запрос:
select
b.id, b.fdate,
c.code, c.name
from ta_bundle b
left join ta_entity c on (c.id = b.entity_id)
rows 1000 to 1010
План выполнения:
Select Expression
-> First N Records
-> Skip N Records
-> Nested Loop Join (outer)
-> Table "TA_BUNDLE" as "B" Full Scan
-> Filter
-> Table "TA_ENTITY" as "C" Access By ID
-> Bitmap
-> Index "PK_TA_ENTITY" Unique Scan
Сканы записей из таблиц:
TA_BUNDLE - 1010
TA_ENTITY - 1010
Хочется чтобы при больших таблицах и скипов движок читал только нужные 10 записей из TA_ENTITY, а не все 1010.
Через lateral то же самое получается:
select
b.id, b.fdate,
c.code, c.name
from ta_bundle b
left join lateral (
select c.code, c.name
from ta_entity c
where c.id = b.entity_id) c on true
rows 1000 to 1010
Работает хорошо только когда подзапрос:
select
b.id, b.fdate,
-- ? c.code
(select c.name from ta_entity c where c.id = b.entity_id)
from ta_bundle b
rows 1000 to 1010
Но так больше одного поля не вытянуть из другой таблицы.
Можно как-то по другому сформировать запрос чтобы движок оптимально сканировал записи?
Тестирую с FB 5.0.1
|
|
|
|
Re: Ненужные сканы записей при rows [сообщение #5913 является ответом на сообщение #5912] |
Fri, 21 February 2025 14:38   |
SD
Сообщений: 432 Зарегистрирован: August 2022
|
Senior Member |
|
|
Чисто из любопытства: ты в курсе, что ROWS без ORDER BY - пустая трата времени?..
Нет способа определить какая запись будет 1000-й, не прочитав предыдущие 999.
Поэтому пагинацию надо делать на клиенте.
[Обновления: Fri, 21 February 2025 14:39] Известить модератора
|
|
|
|
|
|
|
Re: Ненужные сканы записей при rows [сообщение #5930 является ответом на сообщение #5928] |
Mon, 24 February 2025 18:09   |
marcodor
Сообщений: 8 Зарегистрирован: June 2022
|
Junior Member |
|
|
SD, еще раз, у нас выборка из ta_bundle, там ограничение по rows, и там важно сколько записей пропустить, и какие дальше выдавать клиенту.
Дальше для каждой записи из ta_bundle которое попали в rows мы делаем left join ta_entity и берем имя компании, то есть она никак не влияет на общее количество выданных записей и очередность. Или c left join ta_entity, или без, те же записи будут из ta_bundle.
Так вот, почему Firebird читает и для пропущенных записей (первая тысяча) из дополнительной таблицы ta_entity, непонятно, ведь она никак не влияет на rows.
|
|
|
|
|
|
|
|
|
|
|
|
|
Re: Ненужные сканы записей при rows [сообщение #5945 является ответом на сообщение #5911] |
Thu, 27 February 2025 20:45   |
marcodor
Сообщений: 8 Зарегистрирован: June 2022
|
Junior Member |
|
|
Давайте не будем обобщать. Да, безусловно, бывают случаи, когда у нас есть большой набор данных, который мы представляем клиенту в постраничном формате. Например, заказы и их статус, журналы изменения данных. Да, есть возможность фильтрации по периоду и/или другим критериям, но это по сути не решает существующую проблему. Например, я хочу отобразить заказы за март прошлого года. Даже за короткий период времени заказов может быть много.
Зачем прятаться за палец или искать обходные пути, делая вид, что виноват дизайн приложения или разработчик, если на самом деле проблема в чем-то другом. Давайте признаем, что да... проблема в оптимизаторе Firebird, можно ли ее решить или нет, давайте проанализируем.
У меня сложилось впечатление, что некоторые участники — боты или пишут только для того, чтобы заявить о своем присутствии. Как глупо создавать сессию на сервере для каждого набора результатов и позже доставлять ее клиенту. Вы когда-нибудь писали веб-приложение?
Извините, я пишу с телефона во время поездки, у меня нет кириллицы, но GTranslate отлично справился.
|
|
|
|
|
|
|
|
|
Переход к форуму:
Текущее время: Tue Mar 04 00:44:49 GMT+3 2025
Общее время, затраченное на создание страницы: 0.01415 секунд
|