SQL Server 2000/2008 оптимизация запросов - PullRequest
1 голос
/ 09 сентября 2011

Можете ли вы помочь мне оптимизировать следующий запрос. Это занимает очень много времени.

delete from dbo.tgrid_detl  
    where F_TRANS_CD = 'R'
    and SOURCE_ID = 'BVT'
    and not exists
        (select rr.BVT_SOURCE_KEY
             from nurdevusrt.VBVT_RNEWL_RTENTN_DETL RR
         where dbo.tgrid_detl.BVT_SOURCE_KEY = rr.BVT_SOURCE_KEY
         and  YEAR(RR.X_POLICY_XPRTN_DT)>=2009 
         and rr.F_BVT_DIV_NO not in (37,65,88))

EDIT

Я использую SQL Server 2008, но я могу использовать синтаксис SQL Server 2000 или SQL Server 2008 для оптимизации запроса. Не могли бы вы помочь с некоторым решением.

Спасибо

Ответы [ 2 ]

3 голосов
/ 09 сентября 2011

Немедленная мысль:

  • индексы плохие или нет
  • у вас есть триггеры
  • VBVT_RNEWL_RTENTN_DETL - какое-то ужасное представление

Кроме того, измените

YEAR(RR.X_POLICY_XPRTN_DT)>=2009

до

 RR.X_POLICY_XPRTN_DT >= '20090101' AND RR.X_POLICY_XPRTN_DT < '20100101'

Вы индексируете столбец x, а не f(x), где f - функция

2 голосов
/ 09 сентября 2011

Вы можете попробовать следующий эквивалентный оператор, но, скорее всего, либо

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

Удалить скрипт

BEGIN TRAN

DELETE FROM dbo.tgrid_detl
FROM    dbo.tgrid_detl
        LEFT OUTER JOIN nurdevusrt.VBVT_RNEWL_RTENTN_DETL RR
          ON dbo.tgrid_detl.BVT_SOURCE_KEY = rr.BVT_SOURCE_KEY 
             and YEAR(RR.X_POLICY_XPRTN_DT) >= 2009 
             and rr.F_BVT_DIV_NO not in (37,65,88)
WHERE   rr.BVT_SOURCE_KEY IS NULL
        and F_TRANS_CD = 'R' 
        and SOURCE_ID = 'BVT' 

ROLLBACK TRAN
...