当前位置:   article > 正文

Clickhouse WHERE 和 PREWHERE 子句_clickhouse prewhere

clickhouse prewhere

WHERE 子句:

  1. where子句基于条件表达式来实现数据过滤,若过滤条件恰好是主键字段则能进一步通过索引加助查询,在指标索引特性的表引擎
  2. where子句是一条查询语句能否启用索引的判断依据。
  3. where表达式包含主键 能够通过索引过滤数据区间。

PREWHERE子句:

  1. prewhere 目前只适用于*MergeTree系列的表引擎,可以看做是对where的一种优化,和where语句的作用相同,用来过滤数据。
  2. 不同之处在于prewhere首先会读取指定的列数据,来判断数据过滤,等待数据过滤之后再读取select 声明的列字段来补全其余属性。
  3. 在某些场合下,prewhere语句比where语句处理的数据量更少性能更高。
  4. 相关的参数:
  5. Clickhouse> select * from system.settings where name like '%prewhere%'\G
  6. SELECT *
  7. FROM system.settings
  8. WHERE name LIKE '%prewhere%'
  9. Row 1:
  10. ──────
  11. name: optimize_move_to_prewhere
  12. value: 1
  13. changed: 0
  14. description: Allows disabling WHERE to PREWHERE optimization in SELECT queries from MergeTree.
  15. min: ᴺᵁᴸᴸ
  16. max: ᴺᵁᴸᴸ
  17. readonly: 0
  18. type: SettingBool
  19. 1 rows in set. Elapsed: 0.002 sec.
  20. Clickhouse> select count(1) from datasets.hits_v1;
  21. SELECT count(1)
  22. FROM datasets.hits_v1
  23. ┌─count(1)─┐
  24. 8873898
  25. └──────────┘
  26. 1 rows in set. Elapsed: 0.011 sec.
  27. Clickhouse> select count(1) from datasets.hits_v1 where JavaEnable=1;
  28. SELECT count(1)
  29. FROM datasets.hits_v1
  30. WHERE JavaEnable = 1
  31. ┌─count(1)─┐
  32. 6535088
  33. └──────────┘
  34. 1 rows in set. Elapsed: 0.013 sec. Processed 8.87 million rows, 8.87 MB (704.88 million rows/s., 704.88 MB/s.)
  35. Clickhouse> select count(1) from datasets.hits_v1 prewhere JavaEnable=1;
  36. SELECT count(1)
  37. FROM datasets.hits_v1
  38. PREWHERE JavaEnable = 1
  39. ┌─count(1)─┐
  40. 6535088
  41. └──────────┘
  42. 1 rows in set. Elapsed: 0.009 sec. Processed 8.87 million rows, 8.87 MB (977.33 million rows/s., 977.33 MB/s.)
  43. 可以看到相同的结果,时间变少了,每秒处理的数据吞吐量增加。 根据JavaEnable字段进行了过滤。
  44. 测试2
  45. select WatchID,Title,GoodEvent from datasets.hits_v1 where JavaEnable=1;
  46. 6535088 rows in set. Elapsed: 73.843 sec. Processed 8.87 million rows, 863.90 MB
  47. (120.17 thousand rows/s., 11.70 MB/s.)
  48. select WatchID,Title,GoodEvent from datasets.hits_v1 prewhere JavaEnable=1;
  49. 6535088 rows in set. Elapsed: 73.282 sec. Processed 8.87 million rows, 863.90 MB
  50. (121.09 thousand rows/s., 11.79 MB/s.)
  51. 通常Prewhere性能更优,是都需要将所有的where子句都替换为prewhere呢?其实不必这样,clickhouse提供了自动
  52. 化优化的功能,会在条件合适的情况下将where替换为prewhere。默认已经开启了此参数。

不能自动优化的情形:

  1. 1.使用常量表达式:
  2. 2.使用默认值为alias类型的字段
  3. 3.包含了arrayJOIN,globalIn,globalNotIn或者indexHint的查询:
  4. 4.select查询的列字段和where的谓词相同:
  5. 5.使用了主键字段:
  6. 虽然在上述情形不能自动将谓词移动到prewhere,但是仍然可以使用prewhere。以主键字段为例子,当使用了prewhere进行主键查询,
  7. 首先会通过稀疏索引过滤数据区间,接着读取prewhere指定的条件列进行过滤,这样就可能戒掉数据区间的尾巴,从而返回
  8. 低于index_granularity 粒度的数据范围。
  9. 即便如此,相比其他场合移动谓词带来的性能提升,这类效果比较有限,目前在这类场合下仍然保持不移动的处理方式。

参考:

https://clickhouse.tech/docs/en/sql-reference/statements/select/prewhere/

https://clickhouse.tech/docs/en/sql-reference/statements/select/where/

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/273302
推荐阅读
相关标签
  

闽ICP备14008679号