源查询中的 ssis oledb 源死锁
ssis oledb source deadlock in source query
我有一个数据流,oledb 源和 oledb 目标(都是 SQL 服务器)。在source中,有两个表A和B,A有4M行,B有6M行。它们都有 30 多列。当我进行查询时,我 select 从 A 左连接 B 的 30 列,其中 a.date > '2020-01-01'。它将 return 50K 行。查询持续 9 -10 秒。有时,我得到错误
Transaction (Process ID 75) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
即使我直接在源服务器上查询,也能得到
Transaction (Process ID 67) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
但不像在 SSIS 上那么频繁
是否因为它们是事务表,用户可以同时进行一些更新?
如何避免。就像在SSIS中一样,如果失败SSIS可以等待5秒并重新运行吗?
使用 row-versioning isolation levels READ_COMMITTED_SNAPSHOT 隔离或 SNAPSHOT 隔离之一来防止您的 SSIS 源查询获取对其读取的数据的锁定。
SSIS 对日程安排一无所知。通常,这是通过 SQL 代理完成的,您可以在其中指定失败时的重试值。
你问题的根源是为什么我会遇到这些死锁。您正在请求数据,而您的请求正在阻止更重要的查询完成。由于您的查询不太重要,因此它会被扼杀,因此数据库作为一个系统可以保持运行。
您的问题表明您正在查询事务表,是的,系统的日常操作很可能会终止您的查询。默认扩展事件中的死锁图将准确揭示发生了什么(向您的 DBA 寻求帮助)。
正如 David Browne 指出的那样,您可能需要考虑使用不同的隔离级别,以允许您的读取查询在并发 activity inserts/deletes/updates 数据时对数据进行操作。这往往是您为其生成 ETL 的业务部门可以提供指导的决策点。也许使用 "dirty" 数据是可以接受的。如果是这样,请将 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
添加到您的查询中。
如果没有,那么您需要查看正在生成的查询计划并对其进行优化。如果您仅使用它来测试条件是否存在,则左连接可能会被重新处理为 Exists 。也许到处都在进行隐式转换。或者统计数据已过时。或者可以创建覆盖索引。这里有很多选项,但关键要点是使查询速度更快,从而减少资源争用。
我有一个数据流,oledb 源和 oledb 目标(都是 SQL 服务器)。在source中,有两个表A和B,A有4M行,B有6M行。它们都有 30 多列。当我进行查询时,我 select 从 A 左连接 B 的 30 列,其中 a.date > '2020-01-01'。它将 return 50K 行。查询持续 9 -10 秒。有时,我得到错误
Transaction (Process ID 75) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
即使我直接在源服务器上查询,也能得到
Transaction (Process ID 67) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
但不像在 SSIS 上那么频繁
是否因为它们是事务表,用户可以同时进行一些更新?
如何避免。就像在SSIS中一样,如果失败SSIS可以等待5秒并重新运行吗?
使用 row-versioning isolation levels READ_COMMITTED_SNAPSHOT 隔离或 SNAPSHOT 隔离之一来防止您的 SSIS 源查询获取对其读取的数据的锁定。
SSIS 对日程安排一无所知。通常,这是通过 SQL 代理完成的,您可以在其中指定失败时的重试值。
你问题的根源是为什么我会遇到这些死锁。您正在请求数据,而您的请求正在阻止更重要的查询完成。由于您的查询不太重要,因此它会被扼杀,因此数据库作为一个系统可以保持运行。
您的问题表明您正在查询事务表,是的,系统的日常操作很可能会终止您的查询。默认扩展事件中的死锁图将准确揭示发生了什么(向您的 DBA 寻求帮助)。
正如 David Browne 指出的那样,您可能需要考虑使用不同的隔离级别,以允许您的读取查询在并发 activity inserts/deletes/updates 数据时对数据进行操作。这往往是您为其生成 ETL 的业务部门可以提供指导的决策点。也许使用 "dirty" 数据是可以接受的。如果是这样,请将 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
添加到您的查询中。
如果没有,那么您需要查看正在生成的查询计划并对其进行优化。如果您仅使用它来测试条件是否存在,则左连接可能会被重新处理为 Exists 。也许到处都在进行隐式转换。或者统计数据已过时。或者可以创建覆盖索引。这里有很多选项,但关键要点是使查询速度更快,从而减少资源争用。