【发布时间】:2010-11-26 11:34:59
【问题描述】:
我正在从表值函数中选择一些行,但通过将 SELECT TOP 放入查询中发现了莫名其妙的巨大性能差异。
SELECT col1, col2, col3 etc
FROM dbo.some_table_function
WHERE col1 = @parameter
--ORDER BY col1
需要 5 到 6 分钟才能完成。
然而
SELECT TOP 6000 col1, col2, col3 etc
FROM dbo.some_table_function
WHERE col1 = @parameter
--ORDER BY col1
在大约 4 或 5 秒内完成。
如果返回的数据集很大,这不会让我感到惊讶,但所涉及的特定查询返回 200,000 行中的约 5000 行。
因此,在这两种情况下,都会处理整个表,因为 SQL Server 将继续搜索它永远无法到达的 6000 行。那为什么会有巨大的差异呢?这是否与 SQL Server 在预期结果集大小时分配空间的方式有关(TOP 6000 从而使其要求较低,更容易在内存中分配)? 有没有其他人目睹过这样的事情?
谢谢
【问题讨论】:
-
您查看过查询计划吗?有区别吗?
-
只是好奇,如果你说 SELECT TOP 100 PERCENT ....,性能会怎样?
-
我猜你有一些统计数据会使查询优化器陷入困境。例如,如果优化器认为表中的行很少,它可能会决定使用表扫描而不是索引查找。为什么这不会影响我不知道的 TOP 查询,但请检查执行计划。这些向您展示了服务器的功能,这将解释为什么一个服务器很慢。它还会向您显示估计的和实际的行数。如果某些估计值有偏差,请更新统计信息并重试。 :)
-
只是一个疯狂的猜测,但前 6000 名是告诉优化器“为这 6k 条记录节省一些内存”,而没有它可能不正确的猜测将只是一些结果使引擎重新分配内存运行。我发现了一些情况,错误的内存猜测是在 ram 上运行所有内容和尝试使用 TempDB(磁盘)之间的区别
标签: sql sql-server performance tsql user-defined-functions