質問

私は、SQL Server 2000のサーバー上のSQL Server用クエストのヒキガエルを使用しています。

ここに私のクエリです:

SELECT CASE SLCE.GroupName WHEN 'Other' THEN ARM.FBCOMPANY 
                           WHEN 'Inter Co.' THEN ARM.FBCOMPANY 
                           ELSE SLCE.GroupName END AS [Company Name], 
       ARM.fcustno AS [Cust No], 
       ARM.fbcompany AS [Cust Name], 
       ARM.fcinvoice AS [Invoice No], 
       ARM.fdgldate AS [Post Date], 
       year(arm.fdgldate) AS [Year Posted], 
       CASE ARM.fcsource WHEN 'S' THEN 'Shipper' 
                         WHEN 'O' THEN 'Sales Order' 
                         WHEN 'R' THEN 'Receiver' 
                         WHEN 'C' THEN 'Customer' 
                         ELSE ARM.fcsource END AS [Source Doc Type], 
       CASE ARM.fcstatus WHEN 'N' THEN 'New' 
                         WHEN 'U' THEN 'Unpaid' 
                         WHEN 'P' THEN 'Partially Paid' 
                         WHEN 'F' THEN 'Paid in Full' 
                         WHEN 'H' THEN 'Held' 
                         WHEN 'V' THEN 'Voided' 
                         ELSE ARM.fcstatus END AS [Invoice Status], 
       ARM.fpono AS [Cust PO No], 
       ARM.fsalespn AS [Sales Person], 
       ARI.fitem AS [Item No], 
       ARI.fprodcl AS [Prod Class], 
       ARI.fshipkey AS [Qty Invoiced], 
       ARI.ftotprice AS [Net Invoiced], 
       ARI.fpartno AS [Part No], 
       ARI.frev AS [Part Rev], 
       cast(ARI.fmdescript AS VARCHAR(20)) AS [Part Description], 
       ARM.fsono AS [Sales No], 
       ARI.fsokey AS [SO Rels Key], 
       ARI.fordqty AS [Qty Ordered], 
       RED.[YEAR] AS [Year], 
       RED.PERIOD AS [RF Period] 
  FROM dbo.armast ARM 
       INNER JOIN dbo.aritem ARI 
          ON ARM.FCINVOICE = ARI.FCINVOICE 
       INNER JOIN slcdpm SLC 
          ON SLC.fcustno = ARM.fcustno 
       LEFT OUTER JOIN slcdpm_ext SLCE 
         ON SLC.identity_column = SLCE.fkey_id 
       INNER JOIN REDFRIDAYDATES..TBLREDFRIDAYALLDATES RED 
          ON RED.date = CAST (FLOOR (CAST (ARM.fdgldate AS FLOAT)) AS DATETIME) 
 WHERE ARM.fcstatus <> 'V' 
   AND RED.[YEAR] = year(getdate()) 
   AND ari.frev = 'REP' 
   AND ARI.fsalesacc IN ('4010001', '4010002', '4010003', '4010004', '4010005', '4010006', '4010007', '4010008', '4010009', '4010010', '4010018', '4010019', '4010020', '4010021', '4010031', '4010050', '4022000', '4031000', '4045000', '4055000', '4057000', '4060000', '4070000')

ここでヒキガエルのオプションは(違いが強調されて)であります:

INNER JOIN dbo.aritem ARI 
          ON ARM.FCINVOICE = ***COALESCE (ARI.FCINVOICE , ARI.FCINVOICE)*** 
       INNER JOIN slcdpm SLC 
          ON SLC.fcustno = ARM.fcustno 
       LEFT OUTER JOIN slcdpm_ext SLCE 
         ON SLC.identity_column = SLCE.fkey_id 
       INNER JOIN REDFRIDAYDATES..TBLREDFRIDAYALLDATES RED 
          ON RED.date = CAST (FLOOR (CAST (ARM.fdgldate AS FLOAT)) AS DATETIME) 
 WHERE ARM.fcstatus <> 'V' 
   AND RED.[YEAR] = year(getdate()) 
   AND ari.frev = 'REP' 
   AND ARI.fsalesacc IN ('4010001', '4010002', '4010003', '4010004', '4010005', '4010006', '4010007', '4010008', '4010009', '4010010', '4010018', '4010019', '4010020', '4010021', '4010031', '4010050', '4022000', '4031000', '4045000', '4055000', '4057000', '4060000', '4070000') 
   ***AND ARI.[fpartno] >= CHAR(0)***
その合体し、追加と文が50%以上で、このクエリをスピードアップする理由

誰かが私に教えていただけますか?

役に立ちましたか?

解決

あなたは、実際の実行計画を見てきました。これらはあなたのSQL Serverは、これらのクエリを実行にかかった異なるアプローチを表示する必要があります。

他のヒント

これは間違いなく奇妙一つです。実行計画は確かにあなたを伝える必要がありますが、データベース内でこのような性能の変化はほとんど常にインデックスに降りてきます。だから、私の最高の推測では、何らかの形でSQL Serverが、それは使用することができ、インデックスが欠落し、それがより良い目立つ行われ、これらの奇妙な変更を加えることだったということです。

しかし、あなたは「なぜ」次回は、あなたが最初の場所で高速になるためにあなたのクエリを記述することができるように、そこに何が本当にありません関与を学ぶために探している。

もし

完全WAGます:

私はfpartnoはその上に「nullでない」状態を(ので、追加のフィルタは、常にパス)があることを推測するつもりだ、とヒキガエルはそのSQLServerのを知って起こるということは> = CHAR(0)であることを検出するのに十分にスマートではありません常に真実。だから、これはヒキガエルは、オプティマイザはそれにfpartnoたものを使用することは非常に斜めの方法で、案内しようとしていることを示唆しています。その何かが(fcinvoice、fpartno)の複合インデックスにすることもでき..あなたがそれらのいずれかを持っていますか?

他の人が言っ

のように、実行計画は謎を説明するのに役立つことを証明する必要があります。

これらの変更のどちらがクエリの論理的な意味に影響を持っている(つまり、彼らは「何のOPS」ではない)。

ON句にのみ物理的効果COALESCEはARI.FCINVOICEのためにインデックスを使用しようとするから、オプティマイザを防ぐことであろう。

同様に、「> = CHAR(0)」オプティマイザ<上持っていることができる唯一の物理的効果em>の可能性がありますは上(またはも求める)インデックス付きレンジ・スキャンを使用することを検討することをprodになりますARIを持っていた。[fpartno]それにインデックスます。

だから私の結論は、ヒキガエルは、それが明示的なヒントとそのインデックスを使用するのを強制的に実際にをせずに特定のインデックスを使用してにオプティマイザを操作しようとしているだろう。 T-SQLのオプティマイザ・ヒントと本当の問題は、それらの依存関係および脆弱であるとして実際に、それは一種の巧妙なのです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top