Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Избежать временных таблиц / 25 сообщений из 103, страница 1 из 5
16.10.2014, 11:25
    #38778320
fedorov2012
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
Всем привет. Есть запрос вида:
Код: sql
1.
2.
3.
4.
5.
select t1.*
from sp_tree1(:parent_tree1) tr1
       sp_tree2(:parent_tree2) tr2,
       table1 t1
where (t1.group_id1 = tr1.group_id1) and (t1.group_id2 = tr2.group_id1)



Запрос тупит т.к. sp_tree1 и sp_tree2 большие деревья. Решение, которое пока что приходит на ум это выборку по деревьям перекинуть во временные таблицы базы и затем выполнить запрос:
Код: sql
1.
2.
3.
4.
5.
select t1.*
from tmp_tree1 tr1,
       tmp_tree2 tr2,
       table1 t1
where (t1.group_id1 = tr1.group_id) and (t1.group_id2 = tr2.group_id)
...
Рейтинг: 0 / 0
16.10.2014, 11:28
    #38778323
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
fedorov2012Решение, которое пока что приходит на ум это выборку по деревьям перекинуть во временные таблицы базы и затем выполнить запрос:
Вместо решения обычно принято озвучивать задачу...
...
Рейтинг: 0 / 0
16.10.2014, 11:29
    #38778325
fedorov2012
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
Что посоветуете, чтобы с одной стороны избежать временных таблиц, а с другой повысить скорость выполнения запроса?
...
Рейтинг: 0 / 0
16.10.2014, 11:31
    #38778327
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
fedorov2012Что посоветуете, чтобы с одной стороны избежать временных таблиц, а с другой повысить скорость выполнения запроса?
Посоветую показать DDL участвующих объектов, планы выполнения запросов (и в хп тоже) и статистику выполнения.
...
Рейтинг: 0 / 0
16.10.2014, 11:35
    #38778333
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
fedorov2012,

для начала перепиши на нормальный ANSI JOIN
...
Рейтинг: 0 / 0
16.10.2014, 11:41
    #38778342
fedorov2012
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
wadmanПосоветую показать DDL участвующих объектов, планы выполнения запросов (и в хп тоже) и статистику выполнения.
Показать пока нет возможности, основная проблема в том, что sp_tree1 и sp_tree2 в первом варианте sql-запросы вызываются часто и соответственно они части внутри дергают таблицы tree1 и tree2, структура которых такая:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE TREE1 (
    GROUP_ID    INTEGER NOT NULL,
    PARENT         INTEGER,
    NAME  VARCHAR(64),
    SEQUENCE_ID    INTEGER NOT NULL,
    DESCRIPTION    VARCHAR(4096)
);

ALTER TABLE TREE1 ADD CONSTRAINT PK_TREE1 PRIMARY KEY (GROUP_ID);

ALTER TABLE TREE1 ADD CONSTRAINT FK_TREE1 FOREIGN KEY (PARENT) REFERENCES TREE1 (GROUP_ID) ON DELETE CASCADE ON UPDATE CASCADE;
...
Рейтинг: 0 / 0
16.10.2014, 11:44
    #38778348
fedorov2012
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
Симонов Денисдля начала перепиши на нормальный ANSI JOIN
в смысле так?:

Код: sql
1.
2.
3.
4.
select t1.*
from sp_tree1(:parent_tree1) tr1
       join table1 t1 (t1.group_id1 = tr1.group_id1)
       join sp_tree2(:parent_tree2) tr2 (t1.group_id2 = tr2.group_id1)
...
Рейтинг: 0 / 0
16.10.2014, 11:44
    #38778351
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
fedorov2012, сколько записей в tree1, tree2?
...
Рейтинг: 0 / 0
16.10.2014, 11:45
    #38778354
fedorov2012
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
wadmanfedorov2012, сколько записей в tree1, tree2?
в среднем около 4 тыс.
...
Рейтинг: 0 / 0
16.10.2014, 11:48
    #38778362
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
fedorov2012wadmanfedorov2012, сколько записей в tree1, tree2?
в среднем около 4 тыс.
Всего? И сколько мс запрос выполняется?
...
Рейтинг: 0 / 0
16.10.2014, 11:50
    #38778367
fedorov2012
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
wadmanfedorov2012пропущено...

в среднем около 4 тыс.
Всего? И сколько мс запрос выполняется?
несколько минут, просто в table1 несколько миллионов
...
Рейтинг: 0 / 0
16.10.2014, 11:51
    #38778370
fedorov2012
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
Если переписываю на временные таблицы, то работает все на порядки быстрее. Но не хотелось бы прибегать к временным таблицам вот и решил у форумчан спросить совета
...
Рейтинг: 0 / 0
16.10.2014, 11:53
    #38778374
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
fedorov2012Если переписываю на временные таблицы, то работает все на порядки быстрее. Но не хотелось бы прибегать к временным таблицам вот и решил у форумчан спросить совета
Потому что планы строятся разные, потому и просил планы и статистику...
...
Рейтинг: 0 / 0
16.10.2014, 12:22
    #38778439
fedorov2012
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
wadmanПотому что планы строятся разные, потому и просил планы и статистику...
Средствами одного sql-запроса (не переписываю sp_tree1 и sp_tree2) есть ли возможность увеличить скорость выполнения?
...
Рейтинг: 0 / 0
16.10.2014, 12:23
    #38778441
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
fedorov2012не хотелось бы прибегать к временным таблицам
Альтернативой является перепроектирование базы. Ты готов на это пойти?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.10.2014, 12:24
    #38778443
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
fedorov2012wadmanПотому что планы строятся разные, потому и просил планы и статистику...
Средствами одного sql-запроса (не переписываю sp_tree1 и sp_tree2) есть ли возможность увеличить скорость выполнения?
Третий раз: для ответа на этот вопрос недостаточно информации.
...
Рейтинг: 0 / 0
16.10.2014, 12:44
    #38778473
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
fedorov2012Симонов Денисдля начала перепиши на нормальный ANSI JOIN
в смысле так?:

Код: sql
1.
2.
3.
4.
select t1.*
from sp_tree1(:parent_tree1) tr1
       join table1 t1 (t1.group_id1 = tr1.group_id1)
       join sp_tree2(:parent_tree2) tr2 (t1.group_id2 = tr2.group_id1)



нет, ключевое слово ON потерял. Мог бы и проверить сначала.

Код: sql
1.
2.
3.
4.
5.
6.
select 
  t1.*
from 
  t1
  join sp_tree1(:parent_tree1) tr1 on t1.group_id1 = tr1.group_id1
  join sp_tree2(:parent_tree2) tr2 on t1.group_id2 = tr2.group_id1



План запроса где?
...
Рейтинг: 0 / 0
16.10.2014, 12:57
    #38778493
m7m
m7m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
Симонов Денис
Код: sql
1.
2.
3.
4.
5.
6.
select 
  t1.*
from 
  t1
  join sp_tree1(:parent_tree1) tr1 on t1.group_id1 = tr1.group_id1
  join sp_tree2(:parent_tree2) tr2 on t1.group_id2 = tr2.group_id1




вот скажите мне FB сообразит и процедуры sp_tree1, sp_tree2 выполнятся по одному разу?????
...
Рейтинг: 0 / 0
16.10.2014, 13:00
    #38778494
fedorov2012
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
Dimitry SibiryakovАльтернативой является перепроектирование базы. Ты готов на это пойти?..
Нет, а в чем суть перепроектирования бы заключалась - внедрять view?
wadmanТретий раз: для ответа на этот вопрос недостаточно информации.
Т.е.вы намекаете на то, что средствами одного sql-запроса (не переписываю sp_tree1 и sp_tree2) увеличить скорость не получиться
...
Рейтинг: 0 / 0
16.10.2014, 13:02
    #38778500
fedorov2012
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
m7mвот скажите мне FB сообразит и процедуры sp_tree1, sp_tree2 выполнятся по одному разу?????
нет, конечно же
...
Рейтинг: 0 / 0
16.10.2014, 13:02
    #38778501
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
m7mвот скажите мне FB сообразит и процедуры sp_tree1, sp_tree2 выполнятся по одному разу?????Если в плане будет MERGE - да
...
Рейтинг: 0 / 0
16.10.2014, 13:02
    #38778503
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
Вот я на что намекаю... Или пусть программист к обсуждению подключится.
wadmanfedorov2012Что посоветуете, чтобы с одной стороны избежать временных таблиц, а с другой повысить скорость выполнения запроса?
Посоветую показать DDL участвующих объектов, планы выполнения запросов (и в хп тоже) и статистику выполнения.
...
Рейтинг: 0 / 0
16.10.2014, 13:06
    #38778506
Гхостик
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
Если добавить в дерево порядок обхода (и индексы на эти поля, понятно дело), то можно без хранимых процедур:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select t1.*
from TREE1 tp1
join tree1 tc1 on tc1.nleft between tp1.nleft and tp1.nright
join tree1 tp2 on tp2.id = :parent_tree2
join tree1 tc2 on tc2.nleft between tp2.nleft and tp2.nright
join table1 t1 on t1.group_id1 = tc1.group_id1 and t1.group_id2 = tc2.group_id1
where
  tp1.id = :parent_tree1 and
  1=1
...
Рейтинг: 0 / 0
16.10.2014, 13:07
    #38778512
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
fedorov2012Нет, а в чем суть перепроектирования бы заключалась - внедрять view?

Изменение формата хранения деревьев, более тщательное выделение сущностей, нормализация.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.10.2014, 13:13
    #38778526
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избежать временных таблиц
m7mСимонов Денис
Код: sql
1.
2.
3.
4.
5.
6.
select 
  t1.*
from 
  t1
  join sp_tree1(:parent_tree1) tr1 on t1.group_id1 = tr1.group_id1
  join sp_tree2(:parent_tree2) tr2 on t1.group_id2 = tr2.group_id1




вот скажите мне FB сообразит и процедуры sp_tree1, sp_tree2 выполнятся по одному разу?????

зависит от плана запроса. Поэтому и спрашиваю. Хотя даже с MERGE здесь будет жопа.

ибо

fedorov2012просто в table1 несколько миллионов
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Избежать временных таблиц / 25 сообщений из 103, страница 1 из 5
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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