语句 · 2026 年 5 月 14 日 · 8 分钟
没有时间条件,先不要跑大表
公开护栏里有扫描量、返回行数、执行时长。个人能立刻做的,是时间条件先行。事实表没有时间窗,我不跑。看起来武断,能挡住最贵的那类错误。
时间列要选对
下单时间、支付时间、发货时间会把同一天切成三张饼。问题里的动词决定用哪一列。
开闭区间写清楚
常用 >= 开始 AND < 结束,避免一天被算两次。
分区表尤其如此
没有时间谓词,分区裁剪失效,护栏形同虚设。
一次完整的问法可以先写成下面这样:
orders 很大。没有支付时间窗,这条不算问数。
落到语句上,草稿常常是:
SELECT COUNT(*) AS cnt
FROM orders
WHERE pay_time >= DATE '2026-03-01'
AND pay_time < DATE '2026-03-02';
先问一天,再问一个月。胃口可以变大,空窗不可以。
语句是收据,默认只读
第一纪律是 SELECT。草稿里出现更新、删除、结构变更,整张收据作废。第二纪律是时间窗。大表没有时间条件,不跑。第三纪律是粒度。GROUP BY 的键必须和问题里的维度一一对应。
一对多关联会把头上的金额按明细复制,看起来像增长,其实是扇形。COUNT 和 COUNT DISTINCT 不是同一指标。NULL 不是 0。日期函数没有世界语,能写绝对区间就写绝对区间。
复杂逻辑用公共表表达式拆开。拆开是为了给人看中间结果。先对再快。用索引去救一条口径错误的语句,会把错误生产化。
读完这一辑可以做什么
把你最近一条问数语句拆成三段 WITH:过滤、聚合、排名。每一段单独跑。有一段解释不清,就回到提问,不要在语句里继续加花样。
空时间窗的大扫描,不是探索,是占用。