2012-02-24 4 views
0

Я создаю отчет с использованием служб отчетов SQL Server, который выбирает данные из базы данных Oracle. Отчет работает, но для создания (~ 75 секунд) требуется много времени. У меня есть следующая очень простой запрос в моем докладе:Отчет SSRS с проблемами производительности базы данных Oracle

SELECT 
(SELECT COUNT(*) 
    FROM CALL 
    WHERE trunc(start_time) >= :Begin_Date 
    AND trunc(finish_time) <= :End_Date) AS total_calls, 
(SELECT COUNT(*) 
    FROM CALL 
    WHERE DISCONNECT = 'T' 
    AND trunc(start_time) >= :Begin_Date 
    AND trunc(finish_time) <= :End_Date) AS transfered_calls, 
(SELECT COUNT(*) 
    FROM CALL 
    WHERE DISCONNECT = 'H' 
    AND trunc(start_time) >= :Begin_Date 
    AND trunc(finish_time) <= :End_Date) AS hangups 
FROM DUAL 

Теперь я могу выполнить этот запрос в Oracle с использованием Sqlplus * (с датами заполненных конечно) и он выполняет примерно 8 секунд. Когда я пытаюсь выполнить тот же запрос в отчете SSRS, для генерации требуется 75 секунд. Моя забота заключается в том, что мне нужно добавить еще много запросов для завершения отчета, и если это займет так много времени, чтобы сгенерировать эту базовую версию отчета, законный отчет не будет работать. Как повысить эффективность отчета? Есть идеи?

Заранее за вашу помощь.

ответ

0

Пара предложений. Сначала убедитесь, что ваши таблицы правильно проиндексированы, поэтому вы можете использовать Oracle Optimizer. Когда я делаю такие отчеты, я обнаруживаю, что если я создаю представление, которое получает нужные мне данные, он работает лучше. Вы также можете создать хранимую процедуру, чтобы сделать то же самое. Я использовал оба, и я получаю отличные результаты от них. Кроме того, использование встроенных операторов select в предложении SELECT никогда не является отличной идеей. Если вы можете найти способ их удаления (например, вызывать функцию вместо этого), вы, вероятно, увидите некоторые дополнительные выгоды от производительности.

2

Вы, безусловно, может улучшить производительность, только попав в CALL таблицу раз

SELECT COUNT(*) total_calls, 
     SUM(CASE WHEN disconnect = 'T' 
       THEN 1 
       ELSE 0 
      END) transferred_calls, 
     SUM(CASE WHEN disconnect = 'H' 
       THEN 1 
       ELSE 0 
       END) hangups 
    FROM call 
WHERE trunc(start_time) >= :Begin_Date 
    AND trunc(finish_time) <= :End_Date 

Кроме того, индекс-функции на основе TRUNC(start_time) и TRUNC(finish_time), вероятно, будет полезно (при условии, параметры, проходящие в ограничиваем множество строк рассматривается как относительно небольшое подмножество строк в таблице).

Что касается разницы в производительности между SSRS и SQL * Plus, являются ли планы запросов одинаковыми? Вы можете отследить отчет SSRS, чтобы узнать, что он ждет?

+0

+1 Я бы пошел с этим решением первым. Это просто и как вы ДОЛЖНЫ разрабатывать свой запрос. Если у вас по-прежнему возникают проблемы с производительностью, начните изучать другие системные проблемы (например, индексы) и, возможно, создавать представления или хранимые процедуры. – northpole

+0

+1 Если таблица уже имеет индекс в start_time и end_time, тогда запрос должен иметь возможность использовать его, если предложение where изменяется в 'where start_time> =: Begin_Date и заканчивает время

Смежные вопросы