Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Как обычно про скорость работы...... (+) / 6 сообщений из 6, страница 1 из 1
10.08.2006, 12:44
    #33910264
Сергиенко
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обычно про скорость работы...... (+)
Доброго дня...

ASE 12.5.2

Помогите понять где тупняк.
Есть две таблицы, платежей и мемберов. Пытаюсь их связать. Но скорость работы оставляет делать лучшего....
Таблица мемберов это результат связи многие ко многим, между компаниями и видами дейтельности.
Тоесть у компании может быть куча видов деятельности.

Таблица платежей содержит
форен кей на мемберов для плательщика
форен кей на мемберов для получателя
форейн кей на таблицу с статьями бюджета
ну и дальше как обычно статусы, суммы, даты..........

тоесть по форейн кею на мемберов в таблице платежей мы определяем и вид дейтельности и компанию
а по форейнкею на бюджет определяем статью бюджета

теперь мне надо сделать выборку всех платежей компании по определённой статье
исключая платёж в рамках одного вида деятельности.

select isnull(sum(prjPay.pmt_summa), 0) as summa
from projectPayment prjPay, projectMember prjMbr
where prjPay.itb_id_pl = 1
and условия по необходимым полям(входят в индекс)
and prjPay.pmb_id_pl = prjMbr.pmb_id
and prjMbr.cmp_id = 1
and prjMbr.prj_id = 1
and not exists (select 1 from projectMember prjMbr_bf
where prjMbr_bf.pmb_id = prjPay.pmb_id_bf
and prjMbr_bf.prj_id = prjMbr.prj_id)

поле prjPay.itb_id_pl это форейнкей на статьи бюджета
поле prjPay.pmb_id_pl это форейнкей на projectMember для плательщика
поле prjPay.pmb_id_bf это форейнкей на projectMember для получателя
в итоге у меня есть все платежи компании по определённой статье, исключая платежи в рамках одного вида деятельности

но скорость работы, отставляет желать лучшего :(
для таблицы projectMember есть индекс по полям
pmb_id, cmp_id, prj_id
для таблицы projectPayment есть индекс по полям
входящим в условие where

в плане запросов видно что все индексы беруться
однако при наличии 100 тестовых записей в платежах, и 20 записей в мемберах,
и при цикле по все статьям бюджета. 21 статья, тоесть запрос выполняеться 21 раз
получаеться время где-то 5-7 секунд.

Что я делаю не так????
...
Рейтинг: 0 / 0
10.08.2006, 13:15
    #33910372
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обычно про скорость работы...... (+)
Возможно поможет использование дополнительных/ой, агрегированных/ой таблиц/ы, наполнение которых будет производится либо по регламенту, либо триггерами с таблицы платежей. А нужная выборка соответственно будет простым, не тормозящим, select * from super_table.
Это вопрос архитектуры. И ускорить работу селекта по тем таблицам, по которым вы его делаете думаю не получится. Время его выполнения будет всегда зависит от объемов таблиц и как следствие все время расти. Это неправильно.
...
Рейтинг: 0 / 0
10.08.2006, 14:53
    #33910702
Сергиенко
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обычно про скорость работы...... (+)
iLLerВозможно поможет использование дополнительных/ой, агрегированных/ой таблиц/ы, наполнение которых будет производится либо по регламенту, либо триггерами с таблицы платежей. А нужная выборка соответственно будет простым, не тормозящим, select * from super_table.
Это вопрос архитектуры. И ускорить работу селекта по тем таблицам, по которым вы его делаете думаю не получится. Время его выполнения будет всегда зависит от объемов таблиц и как следствие все время расти. Это неправильно.

блин.... на данный момент в течении года колличество платежей равно 25 тысячам. с каждым годом увеличиваясь....
super_table как вариант, но пока так. а потом будем переделывать

НО!!!! неужели для того что бы выполнить такой простой запрос 20 раз, при таком колличстве записей необходимо 5-7 секунд?!?!?!?
...
Рейтинг: 0 / 0
10.08.2006, 15:17
    #33910790
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обычно про скорость работы...... (+)
СергиенкоНО!!!! неужели для того что бы выполнить такой простой запрос 20 раз, при таком колличстве записей необходимо 5-7 секунд?!?!?!?
Вполне может быть, связка получается плохая. К примеру: берем одну таблицу, по индексам - быстро, к ней по ключу вторую, далее отбор по условиям, вот тут индексы уже не помогут, а потом еще для каждого полученного кортежа делаем выборку. Т.е. как ни крути есть элемент перебора. Вот он и тормозит.
Можно не делать агрегирующих таблиц. Например средний вариант, добавить избыточности, в одну из таблиц добавить необходимые в этом запросе данные из другой таблицы, тогда из селекта убирается вторая таблица, строятся необходимые индексы, уходит алгоритм перебора. Но с добавлением избыточности возникает два побочных эффекта - увеличение объема, увеличение времени модификации дублированных данных, в связи с необходимостью поддержания целостности, ну и собсно алгоритм поддержки целостности должен быть отлажен, без дыр.
...
Рейтинг: 0 / 0
11.08.2006, 10:46
    #33912398
Alexandr Kapustin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обычно про скорость работы...... (+)
СергиенкоДоброго дня...


select isnull(sum(prjPay.pmt_summa), 0) as summa
from projectPayment prjPay, projectMember prjMbr
where prjPay.itb_id_pl = 1
and условия по необходимым полям(входят в индекс)
and prjPay.pmb_id_pl = prjMbr.pmb_id
and prjMbr.cmp_id = 1
and prjMbr.prj_id = 1
and not exists (select 1 from projectMember prjMbr_bf
where prjMbr_bf.pmb_id = prjPay.pmb_id_bf
and prjMbr_bf.prj_id = prjMbr.prj_id)

поле prjPay.itb_id_pl это форейнкей на статьи бюджета
поле prjPay.pmb_id_pl это форейнкей на projectMember для плательщика
поле prjPay.pmb_id_bf это форейнкей на projectMember для получателя
в итоге у меня есть все платежи компании по определённой статье, исключая платежи в рамках одного вида деятельности

но скорость работы, отставляет желать лучшего :(
для таблицы projectMember есть индекс по полям
pmb_id, cmp_id, prj_id
для таблицы projectPayment есть индекс по полям
входящим в условие where

в плане запросов видно что все индексы беруться
однако при наличии 100 тестовых записей в платежах, и 20 записей в мемберах,
и при цикле по все статьям бюджета. 21 статья, тоесть запрос выполняеться 21 раз
получаеться время где-то 5-7 секунд.

Что я делаю не так????

1. если можно, упрощенный DDL для создания таблиц, индесов и FK в студию.
(т.е. упрощенный до показанного в примере)
2. в студию план запроса
set showplan on и повторить этот запрос....
3. в студию показатели I/O
set statistics io on и повторить запрос...

После этого можно будет что-то сказать точнее
...
Рейтинг: 0 / 0
11.08.2006, 12:58
    #33913019
Сергиенко
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обычно про скорость работы...... (+)
Alexandr KapustinПосле этого можно будет что-то сказать точнее
Большое спасибо!
Завтра доберусь до работы и скину сюда инфу
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Как обычно про скорость работы...... (+) / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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