这个程序
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。
我们做了以下工作,但无济于事:
我们有一些顾问致力于扩展内部数据仓库。我正在做代码审查并在所有加载过程中遇到这种模式:
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