【发布时间】:2023-04-02 21:50:01
【问题描述】:
当您在查询中使用 Snowflake TOP 子句时,SQL Server 引擎是否会在其足以满足需要返回的 TOP X 行时停止搜索?
【问题讨论】:
标签: snowflake-cloud-data-platform snowflake-schema
当您在查询中使用 Snowflake TOP 子句时,SQL Server 引擎是否会在其足以满足需要返回的 TOP X 行时停止搜索?
【问题讨论】:
标签: snowflake-cloud-data-platform snowflake-schema
我认为这取决于您查询的其余部分。例如,如果您使用TOP 10,但不提供order by,那么是的,它会在返回 10 条记录后立即停止,但您的结果是不确定的。
如果您使用order by,则必须先执行整个查询,然后才能返回前 10 个结果,但您的结果将是确定性的。
这是一个真实的例子。如果我使用limit 10 在SAMPLE_DATA.TPCH_SF10000.CUSTOMER 表上运行选择,它将在1.8 秒内返回(无缓存)。该表中有 1,500,000,000 行。如果我随后检查查询计划,它只扫描了表的一小部分,即 6,971 个分区中的 1 个:
您可以看到,当从初始表扫描中流回 10 条记录时,它将返回,因为它不需要做更多的事情。
【讨论】:
order by 的解释只是一个例子,说明它什么时候不会停止。
根据我的测试和理解,它不会停止。您通常可以看到执行计划中的最后一步是“限制”步骤。您还可以通过查看执行计划来了解正在发生的事情。您通常会在完全处理后看到 LIMIT(或其他)。此外,如果您在没有 LIMIT(或类似)的情况下运行 20 秒的查询并添加 LIMIT,您通常不会看到执行时间有任何差异(但请注意获取时间)。我通常在 UI 中运行查询性能测试,以避免客户端工具出现问题,这些问题可能会由于对游标的限制和/或游标的使用而误导您。
【讨论】: