我有一个数据流、oledb源和oledb目标(都是Server)。在源文件中,有两个表A和B,A有4M行,B有6M行。它们都有30+列。在执行查询时,我从A左联接B中选择30列,其中a.date > '2020-01-01'.它将返回50K行。查询持续9-10秒。有时,我犯了错误
事务(进程ID 75)与另一个进程在锁定资源上陷入僵局,并被选择为死锁受害者。重新运行事务。
即使我直接在源服务器上执行查询,我也可以
事务(进程ID 67)在锁定资源时与另一个进程陷入僵局,并被选择为死锁受害者。重新运行事务。
但不像SSIS那样频繁
因为它们是事务表,用户可以同时进行一些更新吗?
如何避免。就像在SSIS中,如果失败,SSIS可以等待5秒并重新运行吗?
发布于 2020-05-20 19:50:32
SSIS对调度一无所知。通常,这是通过SQL代理完成的,您可以在其中指定对失败值的重试。
你问题的根源是为什么我会被这些死锁。您正在请求数据,而您的请求阻止了更重要的查询的完成。因为您的查询不太重要,所以它会被取消,这样数据库作为一个系统就可以保持运行。
您的问题表明您是在查询事务性表,是的,系统的日常操作可能会扼杀您的查询。默认扩展事件中的死锁图将准确地揭示所发生的事情(向DBA寻求帮助)。
正如David所指出的,您可能需要考虑使用不同的隔离级别,以便在并发活动插入/删除/更新数据时允许读取查询对数据进行操作。这往往是决策点,您正在为其生成ETL的业务单元可以提供指导。也许使用“脏”数据是可以接受的。如果是的话,将SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED添加到查询中。如果没有,则需要查看正在生成的查询计划并对其进行优化。如果只使用左侧联接来测试条件是否存在,则可能会将其重新工作为存在状态。也许所有地方都在进行隐式转换。或者统计数据已经过时了。或者创建一个覆盖指数。这里有很多选项,但关键是使查询速度更快,从而减少资源争用。
发布于 2020-05-20 19:36:11
使用行版本控制隔离级别 READ_COMMITTED_SNAPSHOT隔离或快照隔离来防止SSIS源查询获取它读取的数据的锁。
https://stackoverflow.com/questions/61921428
复制相似问题