Начало » Использование СУБД » Firebird, HQbird, InterBase » Сортировка в большом количестве записей
Сортировка в большом количестве записей [сообщение #5307] |
Tue, 06 August 2024 12:12 |
crazypiggy
Сообщений: 2 Зарегистрирован: August 2024
|
Junior Member |
|
|
Добрый день. У меня есть три таблицы OBJECTS (ID , PARENT_ID , FULL_NAME, SHORT_NAME, LEVEL_ID, FIAS_GUID) в которой хранятся адреса до уровня улицы, переулок и т.д.
HOUSES (ID, OBJECTS_ID, NUM, KORP) таблица домов привязанных к OBJECTS и абонентов ABONENTS (ID, HOUSES_ID, APARTMENT, ROOM, MANAGER_ID)
В таблице ABonents количество записей около 1.5 млн. Мне надо сделать получение записи по порядку. Но если я делаю order by FULL_NAME, NUM, KORP, APARTMENT это занимает достаточно большое время.
Все записи мне тоже не нужны сразу, надо по одной. Подскажите как правильно реализовать проход по порядку по этому набору данных с минимальным временем. Спасибо.
with recursive OBJ (ID, FULL_NAME, PARENT_ID, LEVEL_ID) as
(select id, FULL_NAME, PARENT_ID, LEVEL_ID from objects where parent_id is null
union all
select obj_l.id, obj_l.FULL_NAME, obj_l.PARENT_ID, obj_l.LEVEL_ID from objects obj_l
join obj on obj_l.parent_ID=obj.id)
select * from obj
join houses on houses.objects_id=obj.id
join abonents on abonents.houses_id=houses.id
order by LEVEL_ID, FULL_NAME, NUM, KORP, APARTMENT, ROOM
Это я так пытаюсь получить весь набор данных а потом уже по нему проходить. Но так наверное не очень хорошо и скорость невысокая.
[Обновления: Tue, 06 August 2024 12:34] Известить модератора
|
|
|
|
|
|
|
|
|
Re: Сортировка в большом количестве записей [сообщение #5314 является ответом на сообщение #5313] |
Wed, 07 August 2024 05:29 |
fraks
Сообщений: 134 Зарегистрирован: June 2022 Географическое положение: Новосибирск
|
Senior Member |
|
|
Что бы получить хороший ответ нужно подготовить вопрос в таком виде что бы он не вызывал потребности задавать дополнительные вопросы т.к. на это уходит куча времени.
Начать с версии сервера.
Потом DDL.
-- адреса до уровня улицы, переулок и т.д.
CREATE TABLE OBJECTS (
ID ,
PARENT_ID ,
FULL_NAME,
SHORT_NAME,
LEVEL_ID,
FIAS_GUID
);
-- дома, привязанные к OBJECTS
CREATE TABLE HOUSES (
ID,
OBJECTS_ID,
NUM,
KORP
);
-- абоненты
CREATE TABLE ABONENTS (
ID,
HOUSES_ID,
APARTMENT,
ROOM,
MANAGER_ID
);
Тут, естественно, нужно указать и типы данных, и первичные и прочие ключи, и индексы.
Цитата:В таблице ABonents количество записей около 1.5 млн.
Мне надо сделать получение записи по порядку.
Хорошо бы указать кол-во записей в других таблицах, а так же количество левелов.
Цитата:Но если я делаю order by FULL_NAME, NUM, KORP, APARTMENT это занимает достаточно большое время.
А если делать сортировку только по obj.LEVEL_ID то как со временем? Устраивает?
Если хорошо, то вероятно хватается неэффективный в данном случае индекс по OBJECTS.FULL_NAME есть он или нет, ты не сказал.
Можно попробовать исключить лишние индексы, задав сортировку внутри левела натуралом, возможно так будет выстрее выдаваться.
with recursive OBJ (ID, FULL_NAME, PARENT_ID, LEVEL_ID) as (
select id, FULL_NAME, PARENT_ID, LEVEL_ID
from objects
where parent_id is null
union all
select obj_l.id, obj_l.FULL_NAME, obj_l.PARENT_ID, obj_l.LEVEL_ID
from objects obj_l
join obj on (obj_l.parent_ID = obj.id)
)
select *
from obj
join houses on (houses.objects_id = obj.id )
join abonents on (abonents.houses_id = houses.id )
order by
obj.LEVEL_ID,
obj.FULL_NAME + '', -- отключаем использование индекса
houses.NUM + '', -- отключаем использование индекса
houses.KORP + '', -- отключаем использование индекса
abonents.APARTMENT + '', -- отключаем использование индекса
abonents.ROOM + '' -- отключаем использование индекса
|
|
|
|
|
|
|
|
Переход к форуму:
Текущее время: Fri Nov 15 04:44:43 GMT+3 2024
Общее время, затраченное на создание страницы: 0.01738 секунд
|