SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » Сортировка в большом количестве записей
Сортировка в большом количестве записей [сообщение #5307] Tue, 06 August 2024 12:12 Переход к следующему сообщению
crazypiggy в настоящее время не в онлайне  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: Сортировка в большом количестве записей [сообщение #5308 является ответом на сообщение #5307] Tue, 06 August 2024 12:47 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 887
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
без DDL и PLAN-а неинтересно.
Re: Сортировка в большом количестве записей [сообщение #5309 является ответом на сообщение #5308] Tue, 06 August 2024 13:45 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 330
Зарегистрирован: June 2022
Senior Member
Для начала замени звёздочку на список полей которые нужны. Ибо лишние поля увеличивают ширину записи для сортировки
Re: Сортировка в большом количестве записей [сообщение #5310 является ответом на сообщение #5309] Tue, 06 August 2024 14:30 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 411
Зарегистрирован: August 2022
Senior Member
Потом сократи список полей сортировки так, чтобы они все были из одной таблицы. После чего можно построить по ним индекс и форсить тактику оптимизатора "FIRST ROWS". Firebird 5 для этого имеет прямой хинт OPTIMIZE FOR FIRST ROW, а в остальных версиях нужны будут пляски с бубном.
Re: Сортировка в большом количестве записей [сообщение #5311 является ответом на сообщение #5310] Tue, 06 August 2024 14:53 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 330
Зарегистрирован: June 2022
Senior Member
Дим, у него там рекурсия. С ней такой фокус не прокатит, если ты конечно не сортируешь в том же порядке в котором рекурсивный запрос данные возвращает.

Получать сразу весь набор данных в таком виде так себе затея. Если уж сильно надо, то проще выполнить этот запрос один раз и загнать его результаты в постоянную таблицу, а там сортируй как хочешь
Re: Сортировка в большом количестве записей [сообщение #5312 является ответом на сообщение #5311] Tue, 06 August 2024 15:39 Переход к предыдущему сообщениюПереход к следующему сообщению
crazypiggy в настоящее время не в онлайне  crazypiggy
Сообщений: 2
Зарегистрирован: August 2024
Junior Member
Забыл добавить - Firebird 3. PLANа пока нет под рукой. Про то чтобы все загнать в одну таблицу не подумал. Надо попробовать.

[Обновления: Tue, 06 August 2024 15:41]

Известить модератора

Re: Сортировка в большом количестве записей [сообщение #5313 является ответом на сообщение #5311] Wed, 07 August 2024 00:49 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 411
Зарегистрирован: August 2022
Senior Member
sim_84 писал(а) Tue, 06 August 2024 13:53
Дим, у него там рекурсия. С ней такой фокус не прокатит, если ты конечно не сортируешь в том же порядке в котором рекурсивный запрос данные возвращает.
Не вчитывался в запрос, виноват. С рекурсией, впрочем, можно справиться с помощью SP. Там можно гарантировать порядок возвращения на любом уровне.
Re: Сортировка в большом количестве записей [сообщение #5314 является ответом на сообщение #5313] Wed, 07 August 2024 05:29 Переход к предыдущему сообщениюПереход к следующему сообщению
fraks в настоящее время не в онлайне  fraks
Сообщений: 139
Зарегистрирован: 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      + ''  -- отключаем использование индекса
Re: Сортировка в большом количестве записей [сообщение #5315 является ответом на сообщение #5314] Wed, 07 August 2024 09:34 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 330
Зарегистрирован: June 2022
Senior Member
Не надо тут ничего отключать. Индекс при сортировке всё равно не будет использоваться.
Напомню что план ORDER (навигация по индексу) возможен, если сегменты только этого индекса участвуют в сортировке, причём важен ещё и порядок перечисления полей.
У нас нельзя сделать так чтобы ORDER BY давал SORT поверх ORDER. Чисто теоретически это возможно, но оптимизатор такое сделать не даёт потому, что это будет не эффективно.

Тем более конкатенация это не "+", а "||".
Re: Сортировка в большом количестве записей [сообщение #5316 является ответом на сообщение #5315] Thu, 08 August 2024 03:55 Переход к предыдущему сообщениюПереход к следующему сообщению
fraks в настоящее время не в онлайне  fraks
Сообщений: 139
Зарегистрирован: June 2022
Географическое положение: Новосибирск
Senior Member
sim_84 писал(а) Wed, 07 August 2024 13:34

Тем более конкатенация это не "+", а "||".
Мда, надо же было мне так позорно облажаться...

[Обновления: Thu, 08 August 2024 03:55]

Известить модератора

Re: Сортировка в большом количестве записей [сообщение #5317 является ответом на сообщение #5316] Thu, 08 August 2024 08:26 Переход к предыдущему сообщениюПереход к следующему сообщению
basid в настоящее время не в онлайне  basid
Сообщений: 162
Зарегистрирован: June 2022
Географическое положение: Asia/Irkutsk
Senior Member
Вообще-то - от типа зависит и, для чисел, таки, проще/лучше использовать "+0" Smile
Re: Сортировка в большом количестве записей [сообщение #5323 является ответом на сообщение #5317] Fri, 09 August 2024 05:43 Переход к предыдущему сообщениюПереход к следующему сообщению
fraks в настоящее время не в онлайне  fraks
Сообщений: 139
Зарегистрирован: June 2022
Географическое положение: Новосибирск
Senior Member
basid писал(а) Thu, 08 August 2024 12:26
Вообще-то - от типа зависит и, для чисел, таки, проще/лучше использовать "+0" Smile
Таки да, но нам аффтор исходного запроса типов полей не показал Smile
Re: Сортировка в большом количестве записей [сообщение #5325 является ответом на сообщение #5323] Fri, 09 August 2024 09:36 Переход к предыдущему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 330
Зарегистрирован: June 2022
Senior Member
Я про то что либо пишем +0, либо || '', но не + ''

[Обновления: Fri, 09 August 2024 09:36]

Известить модератора

Предыдущая тема: Вышел Firebird 5.0.1
Следующая тема: Установка Firebird 5.0 под Alt Linux
Переход к форуму:
  


Текущее время: Sun Nov 24 03:22:18 GMT+3 2024

Общее время, затраченное на создание страницы: 0.00729 секунд