0

我试图了解以下情况下的 SQL Server 行为。

我使用在 SQL Server 中创建的链接服务器将大约 50 万行从 Oracle 提取到 SQL Server 2005 数据库中。我正在使用大约 50 个奇数列进行Insert Into select查询。

我发现查询没有完成,它曾经无限期地运行,直到我手动停止它。但是大约 1 小时后,如果我检查目标表,我就能找到表中的行。但是查询既没有停止执行,也没有释放目标表上的排他锁。

当我使用 Oracle 链接服务器发起一个简单查询时,我发现 Oracle 和 SQL Server 中的一些数据类型必须显式转换(尤其是 Oraclenumeric到 SQL Server Varchar)。

在所有出现此问题的数据类型都被显式转换后,我能够毫无问题地完成整个提取,即查询正常停止并释放表上的排他锁。

我的问题是,尽管查询中存在数据类型转换问题,为什么查询仍会获取所有数据,为什么即使在获取所有数据后仍保持锁定?对此的任何解释将不胜感激(即使问题已解决:))

4

1 回答 1

1

MS SQL 使用各种锁,行、列、表。它可能将锁升级到表。它还将更新每行插入的每个相关索引,除非您告诉它不要这样做。解决这个问题有两种方法: 批量插入行:比如 1000 或 10000,尝试为您的列宽度找到合适的批量大小。或者,禁用索引(并记住重新启用它们)。MSSQL 将不得不对整个选择进行所有类型转换,并且可能会使用 tempdb 或内存,因此如果那里有任何限制,这也会减慢速度:内存交换文件等,但分批进行会消除这种情况瓶颈。此外,每个插入都将是一个隐式转换,为了保持一致性,SQL 需要能够回滚......不要忘记将所有这些写入日志文件。

于 2013-03-21T11:32:46.883 回答