0

お客様から、次のSQLビューがプライマリ情報システムのブロックを引き起こすとの苦情があります。私はそれが真実であるかどうかを見つける必要があります(彼らはその時に他のこともしていて、彼らは確信が持てないので)、そして私は状況を修正したいと思います。

背景:以下は、Microsoft SQL Server 2008にインストールされているNavision(現在はMicrosoft Dynamics-Navまたはその呼び方)からデータを抽出するために使用される簡略化されたレガシーSQLコードです。

ビューはSSISパッケージから使用され、固定列幅のtxtファイルにデータを抽出します。結果のファイルは、Navisionに直接関係しない別のソフトウェアにインポートされます。パッケージは、SQLServerエージェントを介してジョブとして起動されます。実行には約10分かかります。

データ抽出プロセスが他のアクティビティをブロックしているかどうかを確認するにはどうすればよいですか?SELECTは常に自動的にブロックされますか?はいの場合、ブロックを回避するためにビューを何らかの方法で改善できますか?

CREATE VIEW [A_Company$my_view] AS
SELECT ItemLedgerEntry.[Document No_] AS DocumentNo,
    ...
    CAST(CONVERT(DECIMAL(14,2),
                 ROUND((SELECT SUM([Sales Amount (Actual)])
                        FROM [A_Company$Value Entry] AS ValueEntry
                        WHERE ValueEntry.[Item Ledger Entry No_] = ItemLedgerEntry.[Entry No_]),
                       2)) AS VARCHAR(14)) AS SalesAmount,
    ...
    Dim1.[Dimension Value Code] AS Dim1,
    ...
    COALESCE((select top 1 [Group Code]
              from [A_Company$Statistic Group Accom]
              where [Type] = 1
                  and [Sales Code] = ItemLedgerEntry.[Source No_]
                  and [Ship-to Code] = ItemLedgerEntry.[Source No_ 3]
                  and [Starting Date] <= ItemLedgerEntry.[Posting Date]
              order by [Starting Date] desc),
             (select top 1 [Group Code]
              from [A_Company$Statistic Group Accom]
              where [Type] = 1
                  and [Sales Code] = ItemLedgerEntry.[Source No_]
                  and [Ship-to Code] = ''
                  and [Starting Date] <= ItemLedgerEntry.[Posting Date]
              order by [Starting Date] desc), ''
              ) as StatisticGroup

FROM [A_Company$Item Ledger Entry] AS ItemLedgerEntry
    LEFT OUTER JOIN [A_Company$Item] AS Item ON (Item.[No_] = ItemLedgerEntry.[Item No_])
    ...
    LEFT OUTER JOIN [A_Company$Salesperson_Purchaser] AS Salesperson_Purchaser
                 ON (Salesperson_Purchaser.[Code] = Customer.[Salesperson Code])

    LEFT OUTER JOIN [A_Company$Ledger Entry Dimension] AS Dim1
      ON (ItemLedgerEntry.[Entry No_] = Dim1.[Entry No_]) AND (Dim1.[Table ID] = 32) AND
         (Dim1.[Dimension Code] = (SELECT [Shortcut Dimension 1 Code] FROM [A_Company$General Ledger Setup]))
    ...
    LEFT OUTER JOIN [A_Company$Ledger Entry Dimension] AS Dim8
      ON (ItemLedgerEntry.[Entry No_] = Dim8.[Entry No_]) AND (Dim8.[Table ID] = 32) AND
         (Dim8.[Dimension Code] = (SELECT [Shortcut Dimension 8 Code] FROM [A_Company$General Ledger Setup]))

WHERE ((ItemLedgerEntry.[Invoiced Quantity] <> 0)
      AND (ItemLedgerEntry.[Entry Type] = 1))

これは、問題を引き起こす可能性があると思われるすべての機能を保持しようとした実際のコードです(繰り返される部分が削除されました)。レビューのために完全なコードを投稿できるStackExchangeフォーラムはありますか?

ブロッキングを回避することが最初のステップです。パフォーマンスの改善について考えてみてください。(私はSQLプログラミングが苦手です。)

お時間をいただき、ありがとうございました、Petr

4

1 に答える 1

2

ある程度、これは他のプロセスが何をしているかに依存します。彼らはどのような種類のロックを要求していますか。

WITH (Nolock)上記のクエリの各テーブル定義の後に追加してみてください。

すなわち

FROM [A_Company$Item Ledger Entry] AS ItemLedgerEntry WITH (NOLOCK)
于 2012-08-30T08:00:07.957 に答える