2016-10-27 13 views
1

このクエリを最適化できますか?現在、以下のクエリを実行するのに30分かかります。MSSQLクエリ最適化(サブクエリ、相関サブクエリ)

サブクエリとして試してみましたが、代わりにOuter Applyを追加しようとしましたが、パフォーマンスは向上していません。どのように私はこの性能を改善するつもりですか?ここで

は、クエリは次のとおりです。

SELECT invoiceno, 
     dealno, 
     customerno, 
     vendorno, 
     previous1 = (SELECT TOP 1 CASE @Tax 
            WHEN 0 THEN (i1.invoicetotal - i1.invoicetax) 
            ELSE i1.invoicetotal 
           END 
        FROM invoiceview i1 WITH (NOLOCK) 
        WHERE --ii1.orderid= 
        i1.orderid = do.orderid 
        AND i1.invoiceno != i.invoiceno 
        AND i1.billingend < i.billingend 
        AND i1.status NOT IN ('ESTIMATE', 'VOID') 
        ORDER BY i1.billingend DESC), 
     previousstatus1 =(SELECT TOP 1 Rtrim(i1.status) 
         FROM invoiceview i1 WITH (NOLOCK) 
         --join invoiceitem ii1 with (nolock) on i1.invoiceid = ii1.invoiceid 
         WHERE --ii1.orderid= 
          i1.orderid = do.orderid 
          AND i1.invoiceno != i.invoiceno 
          AND i1.billingend < i.billingend 
          AND i1.status NOT IN ('ESTIMATE', 'VOID') 
         ORDER BY i1.billingend DESC) 
FROM invoiceview iv 
     LEFT OUTER JOIN dealorder do 
        ON iv.orderid = do.orderid 
     LEFT OUTER JOIN invoice i 
        ON iv.invoiceid = i.invoiceid 
     LEFT OUTER JOIN deal d 
        ON d.dealid = do.dealid 
/*OUTER APPLY (SELECT TOP 1 RTRIM(i1.status) as previousstatus1, (CASE @Tax WHEN 0 THEN (i1.invoicetotal - i1.invoicetax) ELSE i1.invoicetotal END) as previous1 
     FROM invoiceview i1 with (nolock) 
     WHERE i1.orderid = do.orderid and i1.invoiceno ! = i.invoiceno and i1.billingend  ) as a */ 

すべてのヘルプは非常にいただければ幸いです。以前のステータスがないと、previousstatus1クエリは最大10秒以内に実行されます。

+3

これは金融アプリケーションのようです。これらのNOLOCKのヒントは、ある時点で深刻な問題を引き起こす原因となります。そのヒントは、すべてのニュアンスを理解することなく、パフォーマンスツールではありません。ほとんどの人が気付くよりははるかに邪悪です。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –

+4

これを最適化する限り、さらに多くの情報が必要になります。表構造、索引定義、およその行数、現在のシステムからの実際の実行計画。クエリを投げるだけでは、パフォーマンスを向上させるには不十分です。 –

+0

はいインデックス定義とテーブル定義が必要です。 –

答えて

0

ありがとうございました。私はその問題を理解することができました。それはビューでした。私が基本テーブルと結合し、サブクエリではなく外部結合を実際に行った場合、私は大きな違いに気付きました。

関連する問題