首页 > 其他分享 >ClickHouse 语法优化细节(二)

ClickHouse 语法优化细节(二)

时间:2022-11-22 06:55:43浏览次数:47  
标签:datasets UserID visits 语法 v1 细节 ClickHouse SELECT VisitID

5、聚合计算外推

聚合函数内的计算,会外推,例如:
EXPLAIN SYNTAX
SELECT sum(UserID * 2)
FROM datasets.visits_v1;
//优化后效果
SELECT sum(UserID) * 2
FROM datasets.visits_v1

6 聚合函数消除

如果对聚合键,也就是 group by key 使用 min、max、any 聚合函数,则将函数消除,例如: 
EXPLAIN SYNTAX
SELECT sum(UserID * 2),
       max(VisitID),
       max(UserID)
FROM datasets.visits_v1
GROUP BY UserID;
//返回优化后的语句
SELECT sum(UserID) * 2,
       max(VisitID),
       UserID
FROM datasets.visits_v1
GROUP BY UserID

7、删除重复的 order by key

EXPLAIN SYNTAX
SELECT *
FROM datasets.visits_v1
ORDER BY UserID ASC,
         UserID ASC,
         VisitID ASC,
         VisitID ASC;
//返回优化后的语句:
select
    ……
FROM visits_v1
ORDER BY
    UserID ASC,
    VisitID ASC

8、删除重复的 limit by key

例如下面的语句,重复声明的 name 字段会被去重
EXPLAIN SYNTAX
SELECT *
FROM datasets.visits_v1
LIMIT 3 BY
    VisitID,
    VisitID
LIMIT 10
//返回优化后的语句:
select
   ……
FROM datasets.visits_v1
LIMIT 3 BY VisitID
LIMIT 10

9、删除重复的 USING Key

例如下面的语句,重复的关联键 id 字段会被去重:
EXPLAIN SYNTAX
SELECT
    a.UserID,
    a.UserID,
    b.VisitID,
    a.URL,
    b.UserID
FROM datasets.hits_v1 AS a
LEFT JOIN datasets.visits_v1 AS b USING (UserID, UserID)
//返回优化后的语句:
SELECT 
    UserID,
    UserID,
    VisitID,
    URL,
    b.UserID
FROM datasets.hits_v1 AS a
ALL LEFT JOIN datasets.visits_v1 AS b USING (UserID)

10、标量替换

如果子查询只返回一行数据,在被引用的时候用标量替换,例如下面语句中的 total_disk_usage 字段
EXPLAIN SYNTAX
WITH
    (
        SELECT sum(bytes)
        FROM system.parts
        WHERE active
    ) AS total_disk_usage
SELECT
    (sum(bytes) / total_disk_usage) * 100 AS table_disk_usage,
    table
FROM system.parts
GROUP BY table
ORDER BY table_disk_usage DESC
LIMIT 10; 
//返回优化后的语句:
WITH CAST(0, \'UInt64\') AS total_disk_usage
SELECT
    (sum(bytes) / total_disk_usage) * 100 AS table_disk_usage,
    table
FROM system.parts
GROUP BY table
ORDER BY table_disk_usage DESC
LIMIT 10

11 三元运算优化

如果开启了 optimize_if_chain_to_multiif 参数,三元运算符会被替换成 multiIf 函数,例如
EXPLAIN SYNTAX
SELECT number = 1 ? 'hello' : (number = 2 ? 'world' : 'atguigu')
FROM numbers(10)
settings optimize_if_chain_to_multiif = 1; 
//返回优化后的语句:
SELECT multiIf(number = 1, \'hello\', number = 2, \'world\', \'atguigu\')
FROM numbers(10)
SETTINGS optimize_if_chain_to_multiif = 1;

标签:datasets,UserID,visits,语法,v1,细节,ClickHouse,SELECT,VisitID
From: https://www.cnblogs.com/wdh01/p/16877668.html

相关文章

  • mysql复习-基本语法
    第03章_基本的SELECT语句讲师:尚硅谷-宋红康(江湖人称:康师傅)官网:http://www.atguigu.com1.SQL概述1.1SQL背景知识1946年,世界上第一台电脑诞生,如今,借由这台电脑发......
  • MAUI新生1.6-XAML语法基础:样式风格Style&Settter
    一、样式的定义和使用Style类似于前端的CSS,可以对视觉元素的样式进行有组织的管理,大量减少代码和重复工作量。Style需要结合资源字典使用,将Style定义在资源字典中,元素通过......
  • Cesium关于3Dtiles的细节分享
    介绍介绍一下Cesium中有关3dTiles的奇淫技巧,存在一些埋坑的地方,以下内容仅为自己摸索的细节和方法,仅供参考,若有更好的办法欢迎讨论通用快速获取feature中包含的属性信息......
  • CSS基础语法
    1.属性*字体*大小*布局:float2.选择器:class类选择器3.取值与单位*px*color*rpx:自动根据屏幕大小进行适配4.盒子模型*margin距离......
  • Maven工程落地细节复习
    dependencyManagementMaven使用dependencyManagement元素来提供了一种管理依赖版本号的方式。通常会在一个组织或者项目的最顶层的父POM中看到dependencyManagement元......
  • Java 比较两个对象的不同之处(old, new) 包含 bean 对象下的 list, Map , bean 的细节
    Java 比较两个对象的不同之处(old,new)  包含bean对象下的list,Map,bean的细节 packagecom.icil.pinpal.test1;importcom.alibaba.fastjson.JSONObject;......
  • Scala基础语法
    原文链接:https://blog.csdn.net/wangshun_410/article/details/90759688数据类型Scala和Java一样,有7种数值类型Byte、Char、Short、Int、Long、Float和Double(无......
  • 精通正则表达式(Regular Expression)- 语法
    正则表达式是强大,便捷,高效的文本处理工具。正则表达式本身,加上如同一门袖珍编程语言的通用模式表示法,赋予使用者描述和分析文本的能力。配合上特定工具提供的额外支持,正则......
  • SQL学习_1语法
    SQL指结构化查询语言,全称是StructuredQueryLanguage。SQL语句不区分大小写!SQL命令SELECT–从数据库中提取数据UPDATE–更新数据库中的数据DELETE–从数据......
  • PHP一些基础语法,转菜鸟
    数组使用①:遍历关联数组for($arrayas$key=>$value){echo$key.'=>'.$value.PHP_EOL;}②:判断key是否存在boolarray_key_exists(key,array)③:去除(shift)......