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秒以内に実行されます。
これは金融アプリケーションのようです。これらのNOLOCKのヒントは、ある時点で深刻な問題を引き起こす原因となります。そのヒントは、すべてのニュアンスを理解することなく、パフォーマンスツールではありません。ほとんどの人が気付くよりははるかに邪悪です。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –
これを最適化する限り、さらに多くの情報が必要になります。表構造、索引定義、およその行数、現在のシステムからの実際の実行計画。クエリを投げるだけでは、パフォーマンスを向上させるには不十分です。 –
はいインデックス定義とテーブル定義が必要です。 –