小编Bob*_*bst的帖子

跨链接服务器远程查询的 SQL 性能问题

这个程序

create proc dbo.Get_Accounts as
begin
  declare @current_date datetime
  set @current_date = dbo.fn_currdate()

  select [fields]
  into dbo.current_accounts
  from linkedserver.database.dbo.accounts
  where date = @current_date
end
Run Code Online (Sandbox Code Playgroud)

10 分钟后不断失败,并显示以下错误消息:

服务器:消息 7399,级别 16,状态 1,第 1 行 OLE DB 提供程序“SQLOLEDB”报告了错误。由于达到资源限制,提供程序终止了执行。[OLE/DB 提供程序返回消息:超时已过期] OLE DB 错误跟踪 [OLE/DB 提供程序 'SQLOLEDB' ICommandText::Execute 返回 0x80040e31:由于达到资源限制,提供程序终止执行。]。

但是,当我在具有硬编码日期的交互式查询窗口中从同一个数据库(不在远程数据库上)运行相同的查询时:

  select [fields]
  into dbo.current_accounts
  from linkedserver.database.dbo.accounts
  where date = '1/20/2012'
Run Code Online (Sandbox Code Playgroud)

它在 30 秒后返回。

本地服务器是 SQLSERVER 2008,远程服务器是 SQLSERVER 2000。

我们做了以下工作,但无济于事:

  • 重新创建了存储过程。
  • sp_recompile 在存储过程中
  • 更新 dbo.accounts 的统计信息
  • 删除并重新创建了 dbo.accounts 上的索引
  • 删除 dbo.accounts 上的索引并尝试
  • 本地和远程服务器上的 DBCC FREEPROCCACHE …

sql-server sql-server-2000

8
推荐指数
1
解决办法
5万
查看次数

异常的列比较和查询性能

我们有一些顾问致力于扩展内部数据仓库。我正在做代码审查并在所有加载过程中遇到这种模式:

    MERGE [EDHub].[Customer].[Class] AS TARGET
    USING (
        SELECT <columns>
        FROM [dbo].[vw_CustomerClass]
            WHERE JHAPostingDate = @PostingDate   
        ) AS SOURCE
        ON  TARGET.BankId = SOURCE.BankId       -- This join is on the business keys
            AND TARGET.Code = SOURCE.Code
    WHEN NOT MATCHED BY TARGET  
        THEN
            <INSERT Statement>
    WHEN MATCHED
        AND TARGET.IsLatest = 1
        AND EXISTS (
            SELECT SOURCE.[HASH]   
            EXCEPT          
            SELECT TARGET.[Hash]
            )
        THEN 
            <UPDATE Statement>
Run Code Online (Sandbox Code Playgroud)

要点是,如果我们有一个新的业务键,则插入,但如果业务键存在并且属性的散列与我们的当前行不匹配,则更新旧行并插入一个新行(稍后在代码中)。一切正常,但是当我看到这段代码时我暂停了

AND EXISTS (
            SELECT SOURCE.[HASH]   
            EXCEPT          
            SELECT TARGET.[Hash]
            )
Run Code Online (Sandbox Code Playgroud)

与 SOURCE.[HASH] <> TARGET.[Hash] 相比,它似乎过于复杂。EXCEPT 将进行准确的 NULL 比较,但在我们的情况下,哈希值永远不会为 NULL(或者我们有更大的问题)。我希望我们的代码易于阅读,这样当有人必须维护它时,它不会混淆。我向我们的顾问询问了它,他们推测它可能会因为集合操作而更快,但我决定编写一个简单的测试(下面的测试代码)。

我注意到的第一件事是 …

performance sql-server sql-server-2016 except query-performance

6
推荐指数
1
解决办法
415
查看次数