如何在SQL中处理日期?日期函数的实用技巧解析

哎呀,让我告诉你有关 SQL 日期处理的知识。
这都是事实,我也经历过很多陷阱。

去年,我在北京帮助一家电商公司改订单系统,确实很头疼。
他们仍然报告了系统中的统计错误,但经过调查发现数据处理被中断。
我为他们理解了。

首先,你的数据盘点时间最好是UTC。
不要保存当地时间,以避免担心夏令时和时区变化。
我曾经在东京,客户的当地时间与UTC相差9 个小时,所以数据不匹配,所以我纠结了好几天。
后来我改用UTC,问题就消失了。

接下来,不要在 WHERE 子句中的索引列上使用函数。
我真的很坚持这个。
在杭州,我查了一个表,几十万条数据,WHERE DATE_FORMAT(order_date, '%Y-%m-%d') = '2 02 3 -01 -01 ',你猜怎么着?索引全部销毁,全表扫描。
后来我将其更改为 WHERE order_date >= '2 02 3 -01 -01 ' AND order_date < '2 02 3 -01 -02 ',哇,速度快多了。
这个场景我至少换了五六遍,都是一样的。

我们来谈谈时区。
去年我在纽约帮助一家美国公司开发一个系统,他们要求我为美国用户显示时间。
我在数据库中直接使用UTC,并在应用层使用JavaScript进行时区转换。
他们的系统有很多用户和时区,并且数据以UTC存储,因此查询效率高且易于修改。
如果直接在数据库中使用时区函数,修改起来会非常复杂。
如果表太多,性能会很差。
这个场景我帮他们换了两张大桌子,效果还不错。

最后,计算日期差和提取年月日时不要盲目书写。
当年伦敦的一个项目中,有人用NOW()
INTERVAL '3 0' DAY 来计算,结果的数据类型错了,大错特错。
后来我把它改成了DATE_SUB(NOW(), INTERVAL 3 0 DAY),这是正确的。
这样的场景我已经看过很多次了,至少改变了十几个计划。

总之,SQL日期处理,不要复杂化,保持简单明了,效率就会高。
在过去的十年里,我经历了无数的陷阱,才走到了这一步。
请记住使用更少的函数和更多的边界值,在应用程序层解决时区问题,并存储 UTC 数据。
这样就不会有什么大问题了。

从Spark SQL到Flink SQL,SQL优化的通用思路与原理详解!

上周,有客户询问如何将SparkSQL的SQL优化为FlinkSQL。
我给他详细解释了。
首先,无论是SparkSQL还是FlinkSQL,SQL优化要了解执行过程;您需要掌握一般的优化概念,并根据相关引擎的特点调整策略。

1 . SQL优化的一般概念主要包括逻辑优化和物理优化。
像谓词下推这样的逻辑优化就是尽可能提前过滤条件,以减少后续处理的数据量。
列剪枝就是只读取需要的列。
分区修剪是根据条件过滤分区,以减少I/O。
统计数据收集;物理优化,比如连接算法选择、并行化等,就是优化执行计划。

2 SparkSQL和FlinkSQL的优化原理各有特点。
SparkSQL 的 Catalyst 优化器和 Tungsten 引擎以及自适应查询执行 (AQE) 是其优化的关键。
FlinkSQL 的 Planner 架构和状态管理以及事件时间处理是它的优势。

3 Calcite框架引擎SQL解析和一个优化工具。
Hive、Flink、Drill 等引擎都是基于 Calcite 实现的。
执行计划分析也非常重要。
SparkSQL可以使用EXPLAIN,FlinkSQL可以使用EXPLAINPLANFOR。

4 从 SparkSQL 迁移到 FlinkSQL 时;流批集成状态;关注流批集成,这是性能调优的一个共同特征。

5 在集成优化等特定情况下; SparkSQL具有AQE自动分区,FlinkSQL具有MINIBATCH聚合。
SparkSQL 有一个 BroadcastJoin 子表来优化连接,而 FlinkSQL 有一个 JOIN 命令来强制使用特定的算法。

综上所述,SQL优化的核心是了解数据特征;关键在于掌握引擎特性和灵活运用工具。
从 SparkSQL 迁移到 FlinkSQL 时;流批语义;尽管我们应该关注状态管理和事件时间处理方面的差异。
一般优化原则仍然适用。
无论如何,这取决于你。
我还在思考这个问题。
优化SQL确实很复杂。

SQL 优化应该知道的知识点(持更)

这是一个陷阱,你不应该只考虑数量的基础,选择余地更大。

不要相信某个指标,而是使用行数和基数来做出选择性决策。

别这样做。
列表并不是一切。
您需要考虑支持委员会和边缘因素。

不要忽视表关系,了解这些问题和表设计就可以得到优化。

大文件的优化应该是全面的,而不仅仅是关注大小。