【问题标题】:Does snowflake TOP/Limit/Fetch stop processing once it finds enough rows?一旦找到足够的行,雪花 TOP/Limit/Fetch 是否会停止处理?
【发布时间】:2023-04-02 21:50:01
【问题描述】:

当您在查询中使用 Snowflake TOP 子句时,SQL Server 引擎是否会在其足以满足需要返回的 TOP X 行时停止搜索?

【问题讨论】:

    标签: snowflake-cloud-data-platform snowflake-schema


    【解决方案1】:

    我认为这取决于您查询的其余部分。例如,如果您使用TOP 10,但不提供order by,那么是的,它会在返回 10 条记录后立即停止,但您的结果是不确定的。

    如果您使用order by,则必须先执行整个查询,然后才能返回前 10 个结果,但您的结果将是确定性的。

    这是一个真实的例子。如果我使用limit 10SAMPLE_DATA.TPCH_SF10000.CUSTOMER 表上运行选择,它将在1.8 秒内返回(无缓存)。该表中有 1,500,000,000 行。如果我随后检查查询计划,它只扫描了表的一小部分,即 6,971 个分区中的 1 个:

    您可以看到,当从初始表扫描中流回 10 条记录时,它将返回,因为它不需要做更多的事情。

    【讨论】:

    • 我没有应用 order by,但我发现它仍然需要与没有 top 子句相同的执行时间
    • 您的完整 SQL 语句是什么?我对order by 的解释只是一个例子,说明它什么时候不会停止。
    【解决方案2】:

    根据我的测试和理解,它不会停止。您通常可以看到执行计划中的最后一步是“限制”步骤。您还可以通过查看执行计划来了解正在发生的事情。您通常会在完全处理后看到 LIMIT(或其他)。此外,如果您在没有 LIMIT(或类似)的情况下运行 20 秒的查询并添加 LIMIT,您通常不会看到执行时间有任何差异(但请注意获取时间)。我通常在 UI 中运行查询性能测试,以避免客户端工具出现问题,这些问题可能会由于对游标的限制和/或游标的使用而误导您。

    【讨论】:

      猜你喜欢
      • 2012-03-30
      • 2018-03-04
      • 2012-04-05
      • 1970-01-01
      • 2020-10-05
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 2011-01-28
      相关资源
      最近更新 更多