【问题标题】:Linked Server Query Runs But Doesn't Finish?链接服务器查询运行但未完成?
【发布时间】:2011-03-09 06:47:50
【问题描述】:

2010 年 6 月 29 日 - 我在之前的删除语句中有一个未提交的操作。我提交了该操作,但我收到了另一个关于主 ID 冲突的错误。我可以解决这个问题。所以故事的士气,付诸行动。

原始问题 -

我正在尝试运行此查询:

with spd_data as (
select *  
from openquery(IRPROD,'select * from budget_user.spd_data where fiscal_year = 2010')
) 

insert into [IRPROD]..[BUDGET_USER].[SPD_DATA_BUD] 
  (REC_ID, FISCAL_YEAR, ENTITY_CODE, DIVISION_CODE, DEPTID, POSITION_NBR, EMPLID, 
   spd_data.NAME, JOB_CODE, PAY_GROUP_CODE, FUND_CODE, FUND_SOURCE, CLASS_CODE,
   PROGRAM_CODE, FUNCTION_CODE, PROJECT_ID, ACCOUNT_CODE, SPD_ENC_AMT, SPD_EXP_AMT, 
   SPD_FB_ENC_AMT, SPD_FB_EXP_AMT, SPD_TUIT_ENC_AMT, SPD_TUIT_EXP_AMT, 
   spd_data.RUNDATE, HOME_DEPTID, BUD_ORIG_AMT, BUD_APPR_AMT)
SELECT REC_ID, FISCAL_YEAR, ENTITY_CODE, DIVISION_CODE, DEPTID, POSITION_NBR, EMPLID,
       spd_data.NAME, JOB_CODE, PAY_GROUP_CODE, FUND_CODE, FUND_SOURCE, CLASS_CODE, 
       PROGRAM_CODE, FUNCTION_CODE, PROJECT_ID, ACCOUNT_CODE, SPD_ENC_AMT, SPD_EXP_AMT,
       SPD_FB_ENC_AMT, SPD_FB_EXP_AMT, SPD_TUIT_ENC_AMT, SPD_TUIT_EXP_AMT, 
       spd_data.RUNDATE, HOME_DEPTID, lngOrig_amt, lngAppr_amt
  from spd_data
left join Budgets.dbo.tblAllPosDep on project_id = projid 
                                  and job_code = jcc and position_nbr = psno
                                  and emplid = empid
where  OrgProjTest = 'EQUAL';

基本上我是从 IRPROD(一个 oracle 数据库)中选择一个表,将它与一个本地表连接起来,然后将结果插入 IRPROD。

我遇到的问题是,当查询运行时,它永远不会停止。我让它运行了一个小时,它一直在运行,直到我取消它。我可以在带宽监视器上看到进出 SQL Server 数据的情况。另外,如果我只运行查询的选择部分,它会在 4 秒内返回结果。

任何想法为什么它没有完成?我以类似的方式设置了其他查询,并且没有任何问题(授予从本地表而不是远程表插入的那些)。

【问题讨论】:

  • 你有看过Oracle方面吗?这就是你要插入的地方,也就是锁和约束最有可能出现的地方。
  • @Stephanie 没有看过 Oracle 方面。如果有约束,不会抛出错误吗?我会在这方面进行更深入的检查,但我的问题是我对 Oracle 的了解不如对 SQL Server 的熟悉。
  • 创建一个具有单列、唯一约束的表。从一个会话开始两个会话插入 1,然后从第二个会话插入 1。第二个将等待第一个提交或回滚。如果有人提交,则只有一个错误。但它可以永远等待。但是你会遇到什么可能的不确定等待从 SQL Server 读取?是的,可能有 1 个线程,但为什么要注意阻塞机会为零的一面呢?只因为你最熟悉?这就像盯着车里空的燃油表,想知道为什么没有汽油从泵中流出。
  • 另外请记住,许多人无法正确比较时间。查询工具不会一次带回所有结果。生产第一行与最后一行有很大的不同。使用 NL Joins,我可以非常快地获得第一行,但最后一行可能需要很长时间。所以你“查询”可能会很快“返回”,但它不是“完成”。
  • 我通常在 Oracle 端没有问题,99% 的时间我在 SQL Server 端遇到问题。我通过查看锁发现我有一个未提交的事务。我提交了操作(删除),然后弹出另一个关于主 ID 冲突的错误。这个错误我可以处理。

标签: sql-server oracle tsql linked-server openquery


【解决方案1】:

您没有包含任何数量指标。但我建议使用临时表来收集结果。

然后您应该尝试插入前几行。如果这成功了,您将有一个强有力的指标表明一切都很好。

尽量按 project_id 或 emplid 分解每个插入任务,以避免大事务日志。

您还应该考虑制作批量批处理。

【讨论】:

  • 避免大事务日志放在哪一边?甲骨文?这不是一个真正的问题。无论您提交的频率如何,每个插入都将包含相同数量的事务日志。您是在谈论回滚空间还是撤消空间?大批量?这是批量(似乎是多余的)。他正在一次完成所有的行......批量;而不是一次一个......事务性的。
  • 我试图避免使用临时表,但这就是我最终要做的。我不明白批量批处理是什么,我认为这就是我在做的事情。
  • 链接服务器有不同的问题。我总是尽量避免的一件事是跨线路移动大块数据。最好的方法是找到一个好的分区键来将数据分成更小的块。我说的是 25k 到 50k 行等等。我敢打赌,如果他这样做,导入就会成功。
  • 长时间运行的事务会阻止数据库服务器丢弃归档的日志条目。
【解决方案2】:

如果只运行不插入的选择,会返回多少条记录?数据看起来是否正确,还是由于连接而存在多条记录?

您要插入的表上是否有触发器?如果您要返回许多记录,并且表上有旨在逐行运行的触发器,这可能会减慢速度。您还要发送到另一台服务器,因此网络管道可能会减慢您的速度。也许将预算数据发送到 Oracle 服务器并从那里而不是从 SQL Server 插入会更好。

【讨论】:

  • 当我刚刚运行选择时,数据看起来正确。桌子上没有触发器。我确信网络让我变慢了,但就像我说的那样,我还有其他类似的工作运行良好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
相关资源
最近更新 更多