【发布时间】:2012-03-23 10:00:44
【问题描述】:
WITH TOP 100000 (100k) 这个查询在大约 3 秒内完成
WITH TOP 1000000 (1mil) 这个查询大约需要 2 分钟完成
SELECT TOP 1000000
db_id = IDENTITY(int, 1, 1), *
INTO dbo.tablename
FROM dbname.dbo.tablename
实际执行计划总是:
clustered index scan 4% cost
top
top
compute scalar
insert (96% cost)
select into
该表有 130 万行,第一列有一个 int 主键
我可以以某种方式加快速度吗?我正在使用 SQL Server 2008 R2。
【问题讨论】:
-
您确定 SQL Server 不只是忙于扩展 .mdf 或 .ldf 吗?
-
嗯,那么为什么(例如)从 .bak 文件中恢复千兆字节大小的备份比这要快于磁盘空间分配?
-
因为如果您将自动扩展设置为百分比而不是固定数量,它将不断忙于分配更多空间。恢复(通过现有)数据库时,所需的大小是已知的,可以一次性分配。
-
简而言之:只需将 .mdf 和 .ldf 设置为合理的大尺寸,然后再次尝试插入测试。
-
不工作 :( 插入仍然很慢。这样做了:CREATE DATABASE $(db) $(collation) ALTER DATABASE $(db) SET RECOVERY SIMPLE ALTER DATABASE $(db) MODIFY FILE (NAME = $ (db), SIZE = 3000MB, MAXSIZE = 8TB); ALTER DATABASE $(db) MODIFY FILE (NAME = $(db)_log, SIZE = 3000MB, MAXSIZE = 2TB);
标签: performance tsql insert sql-server-2008-r2