monotonic.td 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. # Copyright Materialize, Inc. and contributors. All rights reserved.
  2. #
  3. # Use of this software is governed by the Business Source License
  4. # included in the LICENSE file at the root of this repository.
  5. #
  6. # As of the Change Date specified in that file, in accordance with
  7. # the Business Source License, use of this software will be governed
  8. # by the Apache License, Version 2.0.
  9. $ set-arg-default single-replica-cluster=quickstart
  10. # Test monotonicity analyses which derive from ENVELOPE NONE sources.
  11. # Note that these only test the implementation for monotonic sources,
  12. # they do not test that the analysis doesn't have false positives on
  13. # non-monotonic sources.
  14. # TODO: Once we have support for more "LOAD GENERATOR"-based monotonic
  15. # sources these tests can be migrated to `monotonic.slt`.
  16. $ set non-dbz-schema={
  17. "type": "record",
  18. "name": "cpx",
  19. "fields": [
  20. {"name": "a", "type": "long"},
  21. {"name": "b", "type": "long"}
  22. ]
  23. }
  24. $ kafka-create-topic topic=non-dbz-data
  25. $ kafka-ingest format=avro topic=non-dbz-data schema=${non-dbz-schema} timestamp=1
  26. {"a": 1, "b": 2}
  27. {"a": 1, "b": 1048576}
  28. {"a": 2, "b": 3}
  29. {"a": 2, "b": 4}
  30. > CREATE CONNECTION kafka_conn
  31. TO KAFKA (BROKER '${testdrive.kafka-addr}', SECURITY PROTOCOL PLAINTEXT);
  32. > CREATE SOURCE non_dbz_data
  33. IN CLUSTER ${arg.single-replica-cluster}
  34. FROM KAFKA CONNECTION kafka_conn (TOPIC 'testdrive-non-dbz-data-${testdrive.seed}')
  35. > CREATE TABLE non_dbz_data_tbl FROM SOURCE non_dbz_data (REFERENCE "testdrive-non-dbz-data-${testdrive.seed}")
  36. FORMAT AVRO USING SCHEMA '${non-dbz-schema}'
  37. ENVELOPE NONE
  38. > CREATE MATERIALIZED VIEW monotonic_min AS SELECT a, min(b) FROM non_dbz_data_tbl group by a
  39. > SELECT * FROM monotonic_min
  40. a min
  41. ---
  42. 1 2
  43. 2 3
  44. > CREATE MATERIALIZED VIEW monotonic_max AS SELECT a, max(b) FROM non_dbz_data_tbl group by a
  45. > SELECT * FROM monotonic_max
  46. a max
  47. ---
  48. 1 1048576
  49. 2 4
  50. # Smoke test for aggregate fusion
  51. > CREATE MATERIALIZED VIEW monotonic_fused AS SELECT a, min(b), max(b + 1) FROM non_dbz_data_tbl group by a
  52. > SELECT * FROM monotonic_fused
  53. a min max
  54. ---
  55. 1 2 1048577
  56. 2 3 5
  57. # Propagating monotonicity analysis through indexed views
  58. # TODO: After https://github.com/MaterializeInc/materialize/pull/13238 is merged, modify these tests to dig into
  59. # the plans with `jq` and just check for `MonotonicTopK` being present.
  60. > CREATE VIEW i1 AS SELECT b FROM non_dbz_data_tbl
  61. > CREATE DEFAULT INDEX ON i1
  62. > CREATE VIEW v2 AS SELECT * FROM i1 ORDER BY b LIMIT 3
  63. $ set-regex match=(.User.:\s\d+|\(u\d+\)) replacement=UID
  64. ? EXPLAIN PHYSICAL PLAN AS VERBOSE TEXT FOR SELECT * FROM v2
  65. Explained Query:
  66. TopK::MonotonicTopK order_by=[#0 asc nulls_last] limit=3 must_consolidate
  67. ArrangeBy
  68. input_key=[#0{b}]
  69. raw=true
  70. Get::PassArrangements materialize.public.i1
  71. raw=false
  72. arrangements[0]={ key=[#0{b}], permutation=id, thinning=() }
  73. types=[bigint]
  74. Used Indexes:
  75. - materialize.public.i1_primary_idx (*** full scan ***)
  76. Target cluster: quickstart
  77. > CREATE SOURCE non_dbz_data_indexed
  78. IN CLUSTER ${arg.single-replica-cluster}
  79. FROM KAFKA CONNECTION kafka_conn (TOPIC 'testdrive-non-dbz-data-${testdrive.seed}')
  80. > CREATE TABLE non_dbz_data_indexed_tbl FROM SOURCE non_dbz_data_indexed (REFERENCE "testdrive-non-dbz-data-${testdrive.seed}")
  81. FORMAT AVRO USING SCHEMA '${non-dbz-schema}'
  82. ENVELOPE NONE
  83. > CREATE DEFAULT INDEX ON non_dbz_data_indexed
  84. # Propagating monotonicity analysis from an indexed source
  85. > CREATE VIEW v3 AS SELECT * FROM non_dbz_data_indexed_tbl ORDER BY b LIMIT 3
  86. ? EXPLAIN PHYSICAL PLAN AS VERBOSE TEXT FOR SELECT * FROM v3
  87. Explained Query:
  88. TopK::MonotonicTopK order_by=[#1 asc nulls_last] limit=3 must_consolidate
  89. Get::PassArrangements materialize.public.non_dbz_data_indexed_tbl
  90. raw=true
  91. Source materialize.public.non_dbz_data_indexed_tbl
  92. Target cluster: quickstart
  93. > CREATE VIEW i4 AS SELECT b+1 as c FROM i1;
  94. > CREATE DEFAULT INDEX ON i4;
  95. # Propagating monotonicity analysis through 2 indexed views (i1 and i4)
  96. > CREATE VIEW v5 AS SELECT * from i4 ORDER BY c LIMIT 2;
  97. ? EXPLAIN PHYSICAL PLAN AS VERBOSE TEXT FOR SELECT * FROM v5;
  98. Explained Query:
  99. TopK::MonotonicTopK order_by=[#0 asc nulls_last] limit=2 must_consolidate
  100. ArrangeBy
  101. input_key=[#0{c}]
  102. raw=true
  103. Get::PassArrangements materialize.public.i4
  104. raw=false
  105. arrangements[0]={ key=[#0{c}], permutation=id, thinning=() }
  106. types=[bigint]
  107. Used Indexes:
  108. - materialize.public.i4_primary_idx (*** full scan ***)
  109. Target cluster: quickstart
  110. > CREATE VIEW i6 AS SELECT c FROM v5;
  111. > CREATE DEFAULT INDEX ON i6;
  112. # Non-monotonic indexed view -- v7 can't use a monotonic TopK plan, because i6 and v5 are not monotonic
  113. > CREATE VIEW v7 AS SELECT * from i6 ORDER BY c LIMIT 2;
  114. ? EXPLAIN PHYSICAL PLAN AS VERBOSE TEXT FOR SELECT * FROM v7;
  115. Explained Query:
  116. TopK::MonotonicTopK order_by=[#0 asc nulls_last] limit=2 must_consolidate
  117. ArrangeBy
  118. input_key=[#0{c}]
  119. raw=true
  120. Get::PassArrangements materialize.public.i6
  121. raw=false
  122. arrangements[0]={ key=[#0{c}], permutation=id, thinning=() }
  123. types=[bigint]
  124. Used Indexes:
  125. - materialize.public.i6_primary_idx (*** full scan ***)
  126. Target cluster: quickstart
  127. > CREATE VIEW i8 AS SELECT * from (SELECT * FROM i1 UNION ALL SELECT * FROM i1);
  128. > CREATE DEFAULT INDEX ON i8;
  129. > CREATE VIEW i9 AS SELECT * from (SELECT * FROM i1 UNION ALL SELECT * FROM i8);
  130. > CREATE DEFAULT INDEX ON i9;
  131. > CREATE VIEW v10 as SELECT b FROM i9 ORDER BY b LIMIT 2;;
  132. # Propagating monotonicity analysis in a complex situation: (i1, i1) -> i8; (i1, i8) -> i9
  133. ? EXPLAIN PHYSICAL PLAN AS VERBOSE TEXT FOR SELECT * FROM v10;
  134. Explained Query:
  135. TopK::MonotonicTopK order_by=[#0 asc nulls_last] limit=2 must_consolidate
  136. ArrangeBy
  137. input_key=[#0{b}]
  138. raw=true
  139. Get::PassArrangements materialize.public.i9
  140. raw=false
  141. arrangements[0]={ key=[#0{b}], permutation=id, thinning=() }
  142. types=[bigint]
  143. Used Indexes:
  144. - materialize.public.i9_primary_idx (*** full scan ***)
  145. Target cluster: quickstart
  146. # _No_ propagation of monotonicity through materialized views.
  147. > CREATE MATERIALIZED VIEW m1 AS SELECT b FROM non_dbz_data_tbl;
  148. > CREATE VIEW v11 AS SELECT * FROM m1 ORDER BY b LIMIT 3;
  149. ? EXPLAIN PHYSICAL PLAN AS VERBOSE TEXT FOR SELECT * FROM v11;
  150. Explained Query:
  151. TopK::MonotonicTopK order_by=[#0 asc nulls_last] limit=3 must_consolidate
  152. Get::PassArrangements materialize.public.m1
  153. raw=true
  154. Source materialize.public.m1
  155. Target cluster: quickstart
  156. # Check arrangements, seeing new arrangements can mean a significant increase
  157. # in memory consumptions and should be understood before adapting the values.
  158. > SET cluster_replica = r1
  159. > SELECT mdod.dataflow_name, mdod.name
  160. FROM mz_introspection.mz_arrangement_sharing mash
  161. JOIN mz_introspection.mz_dataflow_operator_dataflows mdod ON mash.operator_id = mdod.id
  162. JOIN mz_introspection.mz_compute_exports USING (dataflow_id)
  163. WHERE export_id LIKE 'u%'
  164. "Dataflow: materialize.public.i6_primary_idx" "Arranged TopK input"
  165. "Dataflow: materialize.public.i6_primary_idx" "Arranged TopK input"
  166. "Dataflow: materialize.public.i6_primary_idx" "Arranged TopK input"
  167. "Dataflow: materialize.public.i6_primary_idx" "Arranged TopK input"
  168. "Dataflow: materialize.public.i6_primary_idx" "Arranged TopK input"
  169. "Dataflow: materialize.public.i6_primary_idx" "Arranged TopK input"
  170. "Dataflow: materialize.public.i6_primary_idx" "Arranged TopK input"
  171. "Dataflow: materialize.public.i6_primary_idx" "Reduced TopK input"
  172. "Dataflow: materialize.public.i6_primary_idx" "Reduced TopK input"
  173. "Dataflow: materialize.public.i6_primary_idx" "Reduced TopK input"
  174. "Dataflow: materialize.public.i6_primary_idx" "Reduced TopK input"
  175. "Dataflow: materialize.public.i6_primary_idx" "Reduced TopK input"
  176. "Dataflow: materialize.public.i6_primary_idx" "Reduced TopK input"
  177. "Dataflow: materialize.public.i6_primary_idx" "Reduced TopK input"
  178. "Dataflow: materialize.public.monotonic_fused" "Arrange ReduceMinsMaxes"
  179. "Dataflow: materialize.public.monotonic_fused" "Arranged MinsMaxesHierarchical input"
  180. "Dataflow: materialize.public.monotonic_fused" "Arranged MinsMaxesHierarchical input"
  181. "Dataflow: materialize.public.monotonic_fused" "Arranged MinsMaxesHierarchical input"
  182. "Dataflow: materialize.public.monotonic_fused" "Arranged MinsMaxesHierarchical input"
  183. "Dataflow: materialize.public.monotonic_fused" "Arranged MinsMaxesHierarchical input"
  184. "Dataflow: materialize.public.monotonic_fused" "Arranged MinsMaxesHierarchical input"
  185. "Dataflow: materialize.public.monotonic_fused" "Arranged MinsMaxesHierarchical input"
  186. "Dataflow: materialize.public.monotonic_fused" ReduceMinsMaxes
  187. "Dataflow: materialize.public.monotonic_fused" "Reduced Fallibly MinsMaxesHierarchical"
  188. "Dataflow: materialize.public.monotonic_fused" "Reduced Fallibly MinsMaxesHierarchical"
  189. "Dataflow: materialize.public.monotonic_fused" "Reduced Fallibly MinsMaxesHierarchical"
  190. "Dataflow: materialize.public.monotonic_fused" "Reduced Fallibly MinsMaxesHierarchical"
  191. "Dataflow: materialize.public.monotonic_fused" "Reduced Fallibly MinsMaxesHierarchical"
  192. "Dataflow: materialize.public.monotonic_fused" "Reduced Fallibly MinsMaxesHierarchical"
  193. "Dataflow: materialize.public.monotonic_fused" "Reduced Fallibly MinsMaxesHierarchical"
  194. "Dataflow: materialize.public.monotonic_max" "Arrange ReduceMinsMaxes"
  195. "Dataflow: materialize.public.monotonic_max" "Arranged MinsMaxesHierarchical input"
  196. "Dataflow: materialize.public.monotonic_max" "Arranged MinsMaxesHierarchical input"
  197. "Dataflow: materialize.public.monotonic_max" "Arranged MinsMaxesHierarchical input"
  198. "Dataflow: materialize.public.monotonic_max" "Arranged MinsMaxesHierarchical input"
  199. "Dataflow: materialize.public.monotonic_max" "Arranged MinsMaxesHierarchical input"
  200. "Dataflow: materialize.public.monotonic_max" "Arranged MinsMaxesHierarchical input"
  201. "Dataflow: materialize.public.monotonic_max" "Arranged MinsMaxesHierarchical input"
  202. "Dataflow: materialize.public.monotonic_max" ReduceMinsMaxes
  203. "Dataflow: materialize.public.monotonic_max" "Reduced Fallibly MinsMaxesHierarchical"
  204. "Dataflow: materialize.public.monotonic_max" "Reduced Fallibly MinsMaxesHierarchical"
  205. "Dataflow: materialize.public.monotonic_max" "Reduced Fallibly MinsMaxesHierarchical"
  206. "Dataflow: materialize.public.monotonic_max" "Reduced Fallibly MinsMaxesHierarchical"
  207. "Dataflow: materialize.public.monotonic_max" "Reduced Fallibly MinsMaxesHierarchical"
  208. "Dataflow: materialize.public.monotonic_max" "Reduced Fallibly MinsMaxesHierarchical"
  209. "Dataflow: materialize.public.monotonic_max" "Reduced Fallibly MinsMaxesHierarchical"
  210. "Dataflow: materialize.public.monotonic_min" "Arrange ReduceMinsMaxes"
  211. "Dataflow: materialize.public.monotonic_min" "Arranged MinsMaxesHierarchical input"
  212. "Dataflow: materialize.public.monotonic_min" "Arranged MinsMaxesHierarchical input"
  213. "Dataflow: materialize.public.monotonic_min" "Arranged MinsMaxesHierarchical input"
  214. "Dataflow: materialize.public.monotonic_min" "Arranged MinsMaxesHierarchical input"
  215. "Dataflow: materialize.public.monotonic_min" "Arranged MinsMaxesHierarchical input"
  216. "Dataflow: materialize.public.monotonic_min" "Arranged MinsMaxesHierarchical input"
  217. "Dataflow: materialize.public.monotonic_min" "Arranged MinsMaxesHierarchical input"
  218. "Dataflow: materialize.public.monotonic_min" ReduceMinsMaxes
  219. "Dataflow: materialize.public.monotonic_min" "Reduced Fallibly MinsMaxesHierarchical"
  220. "Dataflow: materialize.public.monotonic_min" "Reduced Fallibly MinsMaxesHierarchical"
  221. "Dataflow: materialize.public.monotonic_min" "Reduced Fallibly MinsMaxesHierarchical"
  222. "Dataflow: materialize.public.monotonic_min" "Reduced Fallibly MinsMaxesHierarchical"
  223. "Dataflow: materialize.public.monotonic_min" "Reduced Fallibly MinsMaxesHierarchical"
  224. "Dataflow: materialize.public.monotonic_min" "Reduced Fallibly MinsMaxesHierarchical"
  225. "Dataflow: materialize.public.monotonic_min" "Reduced Fallibly MinsMaxesHierarchical"
  226. "Dataflow: materialize.public.non_dbz_data_indexed_primary_idx" "ArrangeBy[[Column(0, \"value\")]]"
  227. "Dataflow: materialize.public.non_dbz_data_indexed_primary_idx" "ArrangeBy[[Column(0, \"value\")]]-errors"
  228. "Dataflow: materialize.public.i1_primary_idx" "ArrangeBy[[Column(0, \"b\")]]"
  229. "Dataflow: materialize.public.i1_primary_idx" "ArrangeBy[[Column(0, \"b\")]]-errors"
  230. "Dataflow: materialize.public.i4_primary_idx" "ArrangeBy[[Column(0, \"c\")]]"
  231. "Dataflow: materialize.public.i4_primary_idx" "ArrangeBy[[Column(0, \"c\")]]-errors"
  232. "Dataflow: materialize.public.i6_primary_idx" "ArrangeBy[[Column(0, \"c\")]]"
  233. "Dataflow: materialize.public.i6_primary_idx" "ArrangeBy[[Column(0, \"c\")]]-errors"
  234. "Dataflow: materialize.public.i6_primary_idx" "Arranged TopK input"
  235. "Dataflow: materialize.public.i6_primary_idx" "Reduced TopK input"
  236. "Dataflow: materialize.public.i8_primary_idx" "ArrangeBy[[Column(0, \"b\")]]"
  237. "Dataflow: materialize.public.i8_primary_idx" "ArrangeBy[[Column(0, \"b\")]]-errors"
  238. "Dataflow: materialize.public.i9_primary_idx" "ArrangeBy[[Column(0, \"b\")]]"
  239. "Dataflow: materialize.public.i9_primary_idx" "ArrangeBy[[Column(0, \"b\")]]-errors"