我有一个非常复杂的多连接TSQL SELECT查询,运行大约8秒并返回大约300K记录。这是目前可以接受的。但是我需要多次重用该查询的结果,所以我将查询结果插入到临时表中。使用与SELECT查询的输出匹配的列预先创建表。但是一旦我执行INSERT INTO ... SELECT - 执行时间超过两倍超过20秒!执行计划显示,46%的查询成本用于“表格插入”,38%用于表格假脱机(Eager Spool)。
知道为什么会这样,以及如何加快速度?
谢谢!
答案 0 :(得分:1)
很难说“为什么”,我们需要更多的信息。 (虽然我的SWAG将与记录有关...)
但是,解决方案中,9次中的9次是使用SELECT INTO来制作临时表。
答案 1 :(得分:1)
根据您提供的信息,我可以提供一些建议。如果您不关心脏读,您可以随时更改事务隔离级别(如果您使用的是MS T-SQL)
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
select ...
这可能会加快初始查询的速度,因为无需对要查询的数据执行锁定。如果您不使用SQL服务器,请执行谷歌搜索,了解如何使用您正在使用的技术执行相同操作。
对于插入部分,您说您正在插入临时表。您的数据库是否支持在临时表上添加主键或索引?如果是,则在其中有一个伪列,它是一个索引列。此外,您是否尝试过使用常规数据库表?根据您的设置,使用它可能会加快插入时间。
答案 2 :(得分:0)
我首先看看标准调整主题。磁盘在运行吗?是否有足够的资源(IO,RAM,CPU等)? RDBMS中是否存在瓶颈?听起来像问题,但锁定发生了什么?其他代码是否给出类似的结果?其他代码是否具有高性能?