首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个SQL视图可以阻止其他活动吗?

这个SQL视图可以阻止其他活动吗?
EN

Stack Overflow用户
提问于 2012-08-30 15:57:43
回答 1查看 101关注 0票数 0

我们的客户抱怨以下SQL视图导致他们的主要信息系统阻塞。我需要找出这是否是真的(因为他们在时间上也做了其他事情,但他们不确定),我想修复这种情况。

背景:以下是用于从安装在Microsoft SQL Server 2008上的Navision (现在是Microsoft Dynamics-Nav或其名称)提取数据的简化遗留SQL代码。

该视图来自SSIS包,用于将数据提取到具有固定列宽的txt文件中。生成的文件被导入到其他与Navision没有直接关系的软件中。该包作为作业通过SQL Server代理启动。运行大约需要10分钟。

如何确定数据提取过程是否会阻塞其他活动?SELECT总是自动阻塞吗?如果是,是否可以以某种方式改进视图以避免阻塞?

代码语言:javascript
复制
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编程。)

非常感谢你抽出时间,皮特

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-30 16:00:08

在某种程度上,这取决于其他进程正在做什么。他们请求的是哪种锁。

您可以尝试在上述查询中的每个表定义之后添加WITH (Nolock)

代码语言:javascript
复制
FROM [A_Company$Item Ledger Entry] AS ItemLedgerEntry WITH (NOLOCK)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12192369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档