Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Ускорить выполнение функции  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
Навеяно темой про знатоков тригеров...

1. Предистория задачи.
Была функция, допустим uf_moves() которая возвращала движение за период, грубо говоря что-то типа:
select 1 as doс_type,
       analit1,
       analit2,
       cnt,
       sum
from table1
where date >= @date_from and date <= @date_to
union all
select 2 as doс_type,
       analit1,
       analit2,
       cnt,
       sum
from table2
where date >= @date_from and date <= @date_to
union all
...
табличек было не много и все работало достаточно быстро (эта функция используется в проекте повсеместно).

2. В чем проблема
Далее в функцию стали вносить всякий мусор путем добавления таких кусочков, которые были нужны, допустим, только в одном отчете. "Умные" люди стали ее использовать по нескольку раз в запросе, естественно им не перестало хватать 256 таблиц на запрос, после чего переписали функцию так, что она стала возвращать таблицу, что то типа:
returns @rez table (...)
insert @rez
select 1 as doc_type,
...
insert @rez
select 2 as doc_type,
...
Сами понимаете, как это стало работать...
Вот, и собственно говоря - вопрос, а как такое дело поправить не переделывая все приложение?
Часть мусора из функции выкинул (те кусочки, которые только в одном месте
нужны) перенеся их в соотв. места. Думаю сделать на табличку в базе
аналогичную rez, индексов на нее наделать и по тригерам заполнять при вставке. А в саму функцию - простой select из этой таблицы с соответствующими условиями из параметров функции. Так вроде оптимизатор додумывается индексы подхватыватить.
Indexed views не подходят - некоторые запросы в функции не позволяют их
применить. Чего еще придумать - даже и не знаю уж. Вот как бывает, всего одна вещь - а тормозит все капитально. А то курсоры убрать, курсоры убрать :) .
19 янв 06, 17:20    [2270550]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить выполнение функции  [new]
RENaissance
Member

Откуда: Муром->Москва
Сообщений: 10895

А не думали, все эти таблицы "слить" в одну и в функции использовать эту общую? Судя по коду, данные
однотипные. Зачем столько одинаковых по структуре таблиц?


Posted via ActualForum NNTP Server 1.3

19 янв 06, 19:37    [2271015]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить выполнение функции  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
RENaissance
А не думали, все эти таблицы "слить" в одну и в функции использовать эту общую? Судя по коду, данные однотипные. Зачем столько одинаковых по структуре таблиц?

Ну так они выглядят однотипно если смотреть на них с точки зрения приход/расход. Это же упрощенный вариант. Фактически, каждый такой select соответствует типу документа хранящемуся в системе (для хранения каждого документа используется от 1 до 5 таблиц). Отношения представленны близко к 3НФ (хотя местами и 1-я не соблюдается :) ).
Просто как сейчас реализовано, чтобы, допустим, получить обороты по одной организации фактически необходимо поднять все данные хранящиеся в базе...
20 янв 06, 11:35    [2272285]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить