Chr*_*row 1 sql optimization google-bigquery
我的背景包括 SQL Server 和 Informix 数据库查询优化(非大数据)。我对如何最大限度地提高这些系统上的数据库性能充满信心。我最近一直在使用 BigQuery 和大数据(大约 9 个多月),优化似乎并不以同样的方式工作。我已经做了一些研究并阅读了一些有关优化的文章,但我仍然需要更好地了解如何在 BigQuery 上进行优化的基础知识。
在SQL Server/Informix中,很多时候我会引入列索引来加速读取。BigQuery 没有索引,所以我主要使用集群。当我在为我认为应该有所作为的列引入集群后进行基准测试时,我没有看到任何重大变化。当我打开查询缓存时,我也没有看到任何差异。这可能是与我尝试过的查询的不幸巧合,或者是错误的看法,但是对于 SQL Server/SQL Lite/Informix,我习惯于看到持续的即时显着改进。我是否误解了集群(我知道它并不完全像索引,但我希望它应该以类似的方式工作),或者可能只是我在优化方面“不走运”。
这才是真正的重点。优化方面几乎不存在“不幸”的事情,但在传统的 RDBMS 中,我会查看执行计划并确切地知道我需要做什么来优化,并找出到底发生了什么。使用 BigQuery,我可以获得“执行详细信息”,但它实际上并没有告诉我太多关于如何优化或查询如何真正崩溃的信息(至少我可以理解)。
我是否需要以一种截然不同的方式来思考 BigQuery?或者它的工作方式与 RDBMS 类似,我可以有意识地使第一个 JOINS 消除尽可能多的记录,使用专注于索引列的“where”子句等。
我觉得我没有像 RDBMS 那样进行优化的控制,但我确信我错过了一个要点(或几个要点!)。我应该考虑哪些 BigQuery 优化的主要策略,以及如何准确了解查询的情况?如果有人有任何优秀文档的链接,那就太棒了 - 我还没有读过一些让我觉得“啊哈,现在我明白了!”的东西。
这绝对是你思维方式的范式转变。你是对的:你在执行中几乎没有任何控制权。你最终会明白这一点。您确实可以控制架构,这就是您的很多胜利所在。(正如其他人在评论中提到的,该文档也绝对有帮助。)
\n\n我个人发现,过早优化是 BigQuery\xe2\x80\x94 中最大的问题之一,通常,您尝试加快查询速度所做的事情实际上会产生负面影响,因为表扫描之类的事情已经得到了很好的优化,并且有您可以影响的内部结构(例如以似乎更优化的方式重组查询,但会强制对磁盘进行额外的洗牌以实现并行化)。
\n\n我们团队似乎极大地提高了绩效的一些最大领域如下:
\n\n尽可能使用半规范化(嵌套/重复)模式。通过在架构中使用嵌套STRUCT
/ARRAY
类型,您可以确保数据与父记录位于同一位置。您基本上可以将它们视为表中的表。使用CROSS JOIN UNNEST()
需要一点时间来适应,但是消除这些连接会带来很大的不同(尤其是在大型结果上)。
尽可能对大型数据集使用分区/聚类。我知道您提到了这一点,只要确保您_PARTITIONTIME
在可能的情况下修剪可以使用的内容,并使用对您的数据有意义的混乱键即可。请记住,集群基本上对数据的存储顺序进行排序,这意味着优化器知道如果满足条件,则不必继续扫描(因此它对低基数值没有太大帮助)
尽可能使用分析窗函数。它们经过了很好的优化,您会发现 BigQuery 的实现非常成熟。通常,您可以通过这种方式消除分组,或者在此过程的早期过滤我们的更多数据。请记住,有时在流程早期WITH
过滤派生表或公共表表达式(CTE/命名查询)中的数据可以使更深层的嵌套查询比尝试在一个平面层中执行所有操作更好。
请记住,视图和通用表表达式(CTE/命名WITH
查询)的结果在执行期间不会具体化。如果多次使用CTE,它将被执行多次。如果多次加入同一个View,就会执行多次。这对于来自物化视图世界的我们团队成员来说很困难(尽管它看起来像是 BQ 世界中的一些东西,因为 API 中显示了一个未使用的materializedView
属性)。
了解查询缓存的工作原理。与某些平台不同,缓存仅存储最外层查询的输出,而不存储其组成部分。因此,只有针对未修改的表/视图的相同查询才会使用缓存\xe2\x80\x94,并且它通常只会持续 24 小时。请注意,如果您使用诸如此类的非确定性函数NOW()
以及许多其他功能,则结果是不可缓存的。请参阅文档的限制和例外部分下的详细信息。
实现您自己的昂贵表格的副本。我们经常这样做,并使用计划的查询和脚本(API和CLI)来标准化和保存数据的本机表副本。这使得我们的客户仪表板以及我们自己的报告查询能够进行非常高效的处理和快速响应。虽然很痛苦,但效果很好。
希望这会给您一些想法,但也请随意在将来对您遇到优化困难的问题发表疑问。当您让周围的人知道您的数据是什么样以及您已经尝试过什么时,他们会非常有帮助。
\n\n祝你好运!
\n