【问题标题】:Select all columns then sample, or select IDs only then join and sample?选择所有列然后抽样,还是只选择 ID 然后加入并抽样?
【发布时间】:2023-03-14 01:58:01
【问题描述】:

问题:假设我们正在查看 100 亿行数值数据,其中 FROM 子句排除了 99% 的条目,您希望哪种方法执行得更好,为什么?

无论哪种方式我都可以争论,但话又说回来,我可能有 6 个月的 SQL 经验,但没有接受过正规的 Compsci 教育。问题是用 ANSI Snowflake SQL 格式化的。

方法一:对所有列进行采样(带条件)。

SELECT col1, col2, col3.... coln
FROM table1
WHERE cond1 and cond2 and cond3... condn
SAMPLE (1000000 rows)

方法 2: 仅样本 ID(带条件)然后加入。

SELECT *
FROM
    (SELECT IDcol
    FROM table1
    WHERE cond1 and cond2 and cond3... condn
    SAMPLE (1000000 rows)
    ) as t1sampled
INNER JOIN
    (SELECT col1, col2, col3.... coln
    FROM table1
    ) as t1
ON t1sampled.IDcol = t1.IDcol

【问题讨论】:

  • 试用并报告。
  • 实际上,Snowflake 可能会为每一个创建完全相同的配置文件,因此这实际上取决于数据以及分析器如何创建执行计划。顺便说一句 - 方法 3 可以利用 CTE,它还可以创建不同的执行计划并以不同的方式执行。
  • @GordonLinoff 报道。迈克,我包含了查询配置文件以揭开发生了什么的神秘面纱。

标签: sql database snowflake-cloud-data-platform


【解决方案1】:

类似的运行时间!

我将上述方法修改为采样 10,000 行(不是 1,000,000 行),因为这个新仓库的迁移数据比我最初想象的要少。

我使用了我们的超小型/轻型 (XS) Snowflake 仓库。

方法一: 6分钟; 75 GB 读取

方法二: 6分2秒; 90 GB 读取

【讨论】:

    【解决方案2】:

    我认为第一种方法更好。无需将表格重新连接到自身,它增加了不必要的复杂性,最终无论哪种方式都会产生相同的结果。 Mike 已经提到查询编译器甚至可能为这两个查询创建相同的计划......

    也仅供参考。 Block sampling 比行采样快得多,但如果您有小表或如果您的微分区包含类似数据(如果表未聚集,则偏向于摄取模式?)。

    【讨论】:

    • 感谢您的提示。我不明白块聚类虽然。该链接没有解释它,@ 987654322@。块大小将决定我是否使用它,因为如果我查看设备使用情况,块大小可能会偏向不同的时区。默认情况下我会坚持使用随机抽样,除非我可以自信地争辩说块抽样不会影响提取。
    • 好点,我只是假设一个块是一个微分区,但这可能不是真的!
    猜你喜欢
    • 2020-05-31
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    相关资源
    最近更新 更多