我有一条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行。这可能是插入缓慢的原因吗?
答案 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 只需几毫秒,但它对插入有很大的改进。
尽量简化查询计划。 例如,如果您有多个连接,请尝试准备多步骤解决方案。