Как я могу оптимизировать этот запрос? - PullRequest
0 голосов
/ 28 августа 2010

Как я могу оптимизировать этот запрос, если следующий запрос возвращает либо все записи в таблице, либо записи, которые соответствуют только до текущей даты?Кстати: запрос предназначен для связанного сервера Oracle на MS Sql 2005 в качестве встроенной функции. Не нужно, чтобы это была функция табличного значения.

ALTER function [dbo].[ftsls031nnnHades](@withExpiredEntries bit =0)
 returns table as return    
select * 
  from openQuery(Hades ,"select '010' comno, 
                                trim(t$cuno) t$cuno,
                                trim(t$cpgs) t$cpgs,
                                t$dile,
                                t$qanp,
                                to_char(t$stdt,'dd Mon yy') t$stdt,
                                to_char(t$tdat,'dd Mon yy') t$tdat,
                                to_char(t$disc,'999.99') t$disc,
                                t$damt,
                                t$cdis,
                                t$gnpr,
                                t$refcntd,
                                t$refcntu 
                           from baan.ttdsls031010 
                          where (to_char(t$Tdat,'yyyy-mm-dd') >= To_char(current_date,'yyyy-mm-dd')) 
                            and (to_char(t$stdt,'yyyy-mm-dd') <= To_char(current_date,'yyyy-mm-dd')) 
                         union all       
                         select '020' comno, 
                                trim(t$cuno) t$cuno,
                                trim(t$cpgs) t$cpgs,
                                t$dile,t$qanp,
                                to_char(t$stdt,'dd Mon yy') t$stdt,
                                to_char(t$tdat,'dd Mon yy') t$tdat,
                                to_char(t$disc,'999.99') t$disc,
                                t$damt,
                                t$cdis,
                                t$gnpr,
                                t$refcntd,
                                t$refcntu 
                           from baan.ttdsls031020 
                          where (to_char(t$tdAt,'yyyy-mm-dd') >= To_char(current_date,'yyyy-mm-dd')) 
                            and (to_char(t$stdt,'yyyy-mm-dd') <= To_char(current_date,'yyyy-mm-dd'))  ")

ps: соглашения об именах столбцов могут быть чуждыдля тех, кто не является BaaN .. Пожалуйста, исключите меня из-за того, что я включил соглашения BaaN в StackOverflow.

Ответы [ 3 ]

3 голосов
/ 28 августа 2010

Никогда не выполняйте никакой функциональной обработки вашего столбца даты (t $ Tdat и t $ stdt относятся к этому типу, не так ли?), Если у вас нет соответствующего индекса на основе функций. Этот подход не позволяет вам использовать индексы для t $ stdt и t $ Tdat и резко снижает производительность.

Вместо этого я бы переписал предложение where следующим образом:

where t$Tdat >= current_date and t$stdt <= current_date

, если current_date имеет тип date. Если это не так, вы можете использовать, например, to_date(current_date, 'DD-MM-YYYY') вместо него.

1 голос
/ 28 августа 2010

На всякий случай совет be here now, который является хорошим, не работает: вам нужно собрать некоторые данные, чтобы знать, где тратится время. Прочтите этот OTN-поток, чтобы узнать, как это сделать для Oracle: http://forums.oracle.com/forums/thread.jspa?messageID=1812597. Для SQL Server применяются те же принципы: используйте их инструменты, чтобы узнать, на что тратит время этот запрос.

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

  • Сколько строк в этих двух таблицах
  • Сколько строк возвращено этим запросом
  • Какие индексы присутствуют в этих двух таблицах
  • Сколько времени занимает запрос
  • Какое время ответа приемлемо, т.е. когда мы закончим настройку

С уважением, Роб.

0 голосов
/ 28 августа 2010

Не уверен, насколько это повысит производительность, но в первую очередь я бы заменил преобразование даты в строку только функциями даты.То есть используйте trunc () вместо to_char ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...