【发布时间】:2023-03-31 10:30:02
【问题描述】:
我有一个大约有 1400 万行的 SQL Server 2008 数据库。里面有两张表
Table1
rowId int, primary key
someData1 int
someData2 int...
Table2
id int, primary key
rowId ==> int, refers to the rowId from Table1
someCalculatedData int...
Table2.rowId is not a foreign key, but I did make a Non-clustered, Non-Unique index on it
当我导入数据时,我将所有数据插入到 Table1 中,然后在 Table2 中找到没有条目的行并将数据插入到该表中。
我通过一次选择 250,000 行、处理数据并将它们插入到 Table2 中,然后找到接下来的 250,000 行,依此类推,直到它们在 Table1 中没有任何行没有任何条目见表 2。
select TOP 250000 rowId from Table1
where NOT EXISTS (select rowId from Table2 where Table1.rowId=Table2.rowId)
这个查询确实变慢了,现在需要两分钟多的时间才能获得下一批。 如果我在没有 TOP 或 SET ROWCOUNT 关键字的情况下运行查询并获取所有行,则查询会在大约 15 秒内返回结果。
有谁知道为什么 TOP 和 SET ROWCOUNT 会导致查询花费比获取所有数据更长的时间?
我能否提高查询的性能,但每次仍然只能获取数据的一个子集?
【问题讨论】:
-
查询是在约 15 秒内返回所有行,还是 开始 返回行,第一个行在 15 秒后返回?
-
如果我在 Sql Server Management Studio 中运行查询,我可以在 5-8 秒后看到一些结果,并且在没有 TOP 关键字的情况下全部在 15 秒后看到。如果我包含 TOP 关键字,我在 2 分钟内什么都看不到
-
它不可能在 15 秒内返回 14 百万行,这意味着必须只剩下很少的满足插入条件的行。为什么不直接插入它们,不带顶部子句?
-
现在我有大约 180 万行在 Table1 中但不在 Table2 中。如果我在本地/在 SSMS 中的同一个框中运行查询,我会在 15 秒内获得 180 万行(只有 rowId 列)。
-
我不确定为什么 TOP 会引入这种差异。显然,计划发生了变化,我怀疑合并连接被嵌套循环连接和/或查询的 MAXDOP 更改。是否可以发布两个查询计划,一个慢的和一个快的?
标签: sql sql-server performance