3

レポートのデータを取得するために使用される SQL クエリがあります。プログラムがレポートをプルするのに時間がかかりすぎるだけです。この SQL を最適化する方法はありますか? これは、SYSPROD1 という名前のリンク サーバーを使用する、複数のサブクエリを含む SELECT クエリです。私は試しましたが、成功していません。ここに私のSQLがあります:

Select   
      invMaster.StockCode, prodclass.[Description],  invMaster.LongDesc,
      (select inv.QtyOnHand from SYSPROD1.SysproCompanyD.dbo.InvWarehouse inv where inv.StockCode = invMaster.StockCode and inv.Warehouse = 'P4') as CSSJHB,
      (select inv.QtyOnHand from SYSPROD1.SysproCompanyD.dbo.InvWarehouse inv where inv.StockCode = invMaster.StockCode and inv.Warehouse = 'KK') as KFCJHB,
      (select inv.QtyOnHand from SYSPROD1.SysproCompanyD.dbo.InvWarehouse inv where inv.StockCode = invMaster.StockCode and inv.Warehouse = 'KF') as KFCMIDRAND,
      (select inv.QtyOnHand from SYSPROD1.SysproCompanyD.dbo.InvWarehouse inv where inv.StockCode = invMaster.StockCode and inv.Warehouse = 'QK') as QKJHB,
      (select inv.QtyOnHand from SYSPROD1.SysproCompanyD.dbo.InvWarehouse inv where inv.StockCode = invMaster.StockCode and inv.Warehouse = 'SD') as SDBBLOEM, 
      (select inv.QtyOnHand from SYSPROD1.SysproCompanyD.dbo.InvWarehouse inv where inv.StockCode = invMaster.StockCode and inv.Warehouse = 'SL') as SEQUENCE,
      (select inv.QtyOnHand from SYSPROD1.SysproCompanyD.dbo.InvWarehouse inv where inv.StockCode = invMaster.StockCode and inv.Warehouse = 'PA') as CSSCT,
      (select inv.QtyOnHand from SYSPROD1.SysproCompanyD.dbo.InvWarehouse inv where inv.StockCode = invMaster.StockCode and inv.Warehouse = 'VL') as CSGEORGE



from        
      SYSPROD1.SysproCompanyD.dbo.InvMaster invMaster  join SYSPROD1.SysproCompanyD.dbo.SalProductClass prodclass
      on invMaster.ProductClass = prodclass.ProductClass 

  where prodclass.[Description] in ('WHOLEBIRDS','ABI & OTHER', 'CATERING PORTIONS', 'FILLETED PRODUCTS', 'FRESH PRODUCTS','INDUSTRIAL CATERING', 'IQF PORTIONS', 'LOW VALUE FIXED MASS', 'RED MEAT', 'REJECT EGGS' ,'SUNDRY PRODUCTS','VALUE ADDED')                   
    group by invMaster.StockCode, prodclass.[Description],  invMaster.LongDesc

  order by prodclass.[Description], invMaster.StockCode asc
4

2 に答える 2

3

ここで記述している種類のリンクサーバークエリ(リモートサーバー上の複数のテーブルが結合されている場合)は、SQLエンジンがローカルクエリの計画を最適化するために使用するトリックの多くを使用できないため、通常はパフォーマンスが低下します。たとえば、リンクサーバーへの接続に使用されるセキュリティコンテキストがsysadmindb_ownerまたはdb_ddladminロールのメンバーでない限り、呼び出し元のサーバーはテーブル統計にアクセスできません。このクエリの計画では、クエリの実行中に、の内容全体がプルされ、呼び出し元のマシンに何度も戻される可能性がSYSPROD1.SysproCompanyD.dbo.InvMasterあります。これが時間がかかっていますSYSPROD1.SysproCompanyD.dbo.SalProductClassSYSPROD1.SysproCompanyD.dbo.InvWarehouse

このクエリのパフォーマンスを改善するためのオプションがいくつかあります。1つは、リンクサーバー上の各テーブルから必要な行を、クエリに結合する前に一時テーブルまたはテーブル変数に挿入することです。

2つ目は、このクエリ全体がリンクサーバー上のテーブルで満たされる可能性がある場合、そのサーバー上のビューとしてクエリを作成することです。これは、すべての処理がそこで実行され、はるかに効率的であることを意味します。

于 2012-04-18T08:45:35.350 に答える
0

JOINsで最適化できます。

Select    
      invMaster.StockCode, prodclass.[Description],  invMaster.LongDesc, w1.QtyOnHand AS CSSJHB

..<snip>

from         
      SYSPROD1.SysproCompanyD.dbo.InvMaster invMaster  
join SYSPROD1.SysproCompanyD.dbo.SalProductClass prodclass 
      on invMaster.ProductClass = prodclass.ProductClass
INNER JOIN SYSPROD1.SysproCompanyD.dbo.InvWarehouse w1 on w1.StockCode = invMaster.StockCode AND w1.Warehouse = 'P4'

のサブクエリごとに繰り返しますSELECT

于 2012-04-18T07:10:10.837 に答える