INSERT INTO SELECT和SELECT INTO比SELECT花费更长的时间

时间:2018-07-11 06:05:47

标签: sql sql-server tsql sqlperformance

我有一条SELECT语句,执行该语句大约需要500-600ms。如果我在INSERT INTO ... SELECT ... or SELECT ... INTO中使用相同的SELECT,则最多需要30秒。

由于性能原因,该表更像视图的数据副本,该表会不时地被截断并填充数据。所以我的SQL看起来像:

TRUNCATE myTable
INSERT INTO myTable (col, col, col) SELECT col, col, col FROM otherTable INNER JOIN ...

我尝试了多种操作,例如将数据插入到临时表中,因此表上没有索引等(当然,我也尝试从原始表中删除索引),但似乎无济于事。如果我先将数据插入到临时表中(这也需要30秒),然后再将其复制到真实表中,则复制本身就非常快(<1秒)。

查询结果约3800行,例如30-40列。

第二次执行Truncate-INSERT INTO / SELECT INTO sql不到一秒钟(直到我清除所有缓存)。除了表插入的执行计划成本为90%外,执行计划看起来相同。

也尝试摆脱任何隐式转换,但这也无济于事。

有人知道这怎么可能或我怎么发现问题?在运行Sql Server 2014/2016的多个系统上存在该问题。

编辑:刚看到我的SELECT的执行计划显示了“ Excessiv Grant”消息,因为它估计有〜11000行,但结果只有〜3800行。这可能是插入缓慢的原因吗?

3 个答案:

答案 0 :(得分:0)

就现在的价值而言,直到今天我也遇到了类似的问题。原来,我要插入的表具有INT类型,而我从中选择的表具有SMALLINT类型。因此,每一行都进行了几次类型转换。

一旦我将目标表更改为与源表相同的类型,然后将其插入和选择到相同的数量级。

答案 1 :(得分:0)

我遇到了同样的问题。我的SELECT和目标表中的所有数据类型,大小和allow-NULLS都相同。我尝试将表更改为HEAP,然后更改为群集,但这没有什么区别。 SELECT大约花了15秒,而INSERT花了大约4分钟。 以我为例,我最终使用SELECT INTO到一个临时表中,然后从该表中进行SELECT到我的真实表中,然后恢复到15秒左右。 OP表示他们尝试了此操作,但没有成功,但可能对某些人有用。

答案 2 :(得分:0)

我遇到了同样的问题。 Select 需要大约 900 毫秒来执行插入/选择到需要超过 2 分钟。

我重新编写了 select 以提高性能 - select 只需几毫秒,但它对插入有很大的改进。

尽量简化查询计划。 例如,如果您有多个连接,请尝试准备多步骤解决方案。