【问题标题】:SQL SERVER - INSERT INTO.. SELECT.. results in different no. of rows inserted than in SELECT.. itselfSQL SERVER - INSERT INTO.. SELECT.. 结果不同。插入的行数比 SELECT.. 本身
【发布时间】:2019-01-24 19:46:24
【问题描述】:

我正在执行简单的插入查询,如下所示: 插入到 tbl_destination ... SELECT ... FROM [SomeOtherLinkedServer].tbl_source

尽管 SELECT 返回 9'000'000 行,但它会导致将 3'000'000 行插入到目标表中。可能是什么原因? 我正在使用 SQL Servers 2005 标准版。目标表和源表位于两个不同的 SQL 服务上。不显示错误消息。目标表用作临时数据堆 - 它没有 prim。关键,没有索引。我检查了 tbl_destination 的磁盘空间和可用空间量 - 大量 GB。奇怪..我将不胜感激任何建议!

编辑: 谢谢你到目前为止的建议。 当我在本地(在链接服务器上)和登录到链接服务器本身时运行 SELECT COUNT(*) 时,它显示了 9M 行。 但是,当我在链接服务器上运行实际的 SELECT ... 时:

SELECT ... FROM [SomeOtherLinkedServer].tbl_source

结果是 3M 行并且没有错误消息。 登录到远程服务器时执行相同的查询:

SELECT ... FROM tbl_source

还返回了 3M 行,但这次带有错误消息(因此在执行使用链接服务器上的表的查询时,似乎没有显示所有错误消息):

Msg 701, Level 17, State 123, Line 1

There is insufficient system memory to run this query.

所以现在看起来很明显这是内存问题。有什么办法(无需在服务器上安装更多内存)来克服这个问题 - 将此查询的整个结果插入到表中?谢谢! 还有一件事- tbl_source 不是真正的表,它是一个视图。不幸的是,由其他人维护,因此优化其内部结构不是一种选择(至少目前如此)。

【问题讨论】:

  • 您能否在执行 INSERT 和 SELECT 时发布您的实际查询
  • 您是否比较了您正在生成的两组数据?较大的集合是否只是较小集合中每一行的三个副本?
  • 看一下管理工作室的日志

标签: sql sql-server


【解决方案1】:

您是否考虑过对结果进行分区并对插入进行批处理?

Insert into...
Select * from ....
Where rowid between 0 and 1000000


Insert into...
Select * from ....
Where field1 between 1000000 and 2000000

...etc

【讨论】:

    【解决方案2】:

    如果目标表为空,则可以删除该表并执行 Select into 语句。

    select * into destination_table
    from [otherserver].otherdb.dbo.other_table
    

    【讨论】:

    • 我通常不推荐 SELECT-INTO。我会先创建然后插入,因为它让我的东西更干净。
    猜你喜欢
    • 2012-01-23
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 2014-04-23
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多