Начало » Использование СУБД » Firebird, HQbird, InterBase » Ненужные сканы записей при rows
Ненужные сканы записей при rows [сообщение #5911] |
Fri, 21 February 2025 12:49  |
marcodor
Сообщений: 4 Зарегистрирован: 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
Сообщений: 428 Зарегистрирован: August 2022
|
Senior Member |
|
|
Чисто из любопытства: ты в курсе, что ROWS без ORDER BY - пустая трата времени?..
Нет способа определить какая запись будет 1000-й, не прочитав предыдущие 999.
Поэтому пагинацию надо делать на клиенте.
[Обновления: Fri, 21 February 2025 14:39] Известить модератора
|
|
|
|
|
Переход к форуму:
Текущее время: Sat Feb 22 23:59:40 GMT+3 2025
Общее время, затраченное на создание страницы: 0.00692 секунд
|