SQL Server 2000/2008 optimization des requêtes

pouvez-vous s'il vous plaît m'aider à optimiser la requête suivante. Cela prend beaucoup de time.

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)) 

MODIFIER

J'utilise sql server 2008 mais je peux utiliser la syntaxe de sql server 2000 ou sql server 2008 pour optimiser la requête. Pourriez-vous s'il vous plaît aider avec une solution.

Merci

Pensée immédiate:

  • les indices sont pauvres ou pas là
  • vous avez des triggersurs
  • VBVT_RNEWL_RTENTN_DETL est une vue horrible

Aussi, changer

 YEAR(RR.X_POLICY_XPRTN_DT)>=2009 

à

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

Vous indexez la colonne x , et non f(x) où f est une fonction

Vous pourriez essayer de suivre une déclaration équivalente, mais le plus probable soit

  • vous n'avez pas suffisamment d'index ou
  • vos tables sont vraiment grandes ou
  • votre server ne peut pas suivre

Supprimer le script

 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