singlereplica_attribution_sources.slt 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296
  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. # Ensure attribution sources function (are created, dropped appropriately)
  10. mode cockroach
  11. reset-server
  12. # VIEW + INDEX
  13. statement ok
  14. CREATE TABLE t(x INT NOT NULL, y INT, z TEXT);
  15. statement ok
  16. CREATE VIEW v AS
  17. SELECT t1.x AS x, t1.z AS z1, t2.z AS z2
  18. FROM t AS t1, t AS t2
  19. WHERE t1.x = t2.y;
  20. statement ok
  21. CREATE INDEX v_idx_x ON v(x);
  22. # let the introspection sources update
  23. statement ok
  24. SELECT mz_unsafe.mz_sleep(8)
  25. query IT
  26. SELECT id, global_id FROM mz_internal.mz_dataflow_global_ids ORDER BY id, global_id;
  27. ----
  28. 4 u2
  29. 4 u3
  30. query TI
  31. SELECT global_id, lir_id FROM mz_internal.mz_lir_mapping ORDER BY global_id, lir_id DESC;
  32. ----
  33. u2 5
  34. u2 4
  35. u2 3
  36. u2 2
  37. u2 1
  38. u3 7
  39. u3 6
  40. ## attribution queries
  41. # omitting sum(duration_ns) as duration, sum(count) as count
  42. query TIIT
  43. SELECT global_id, lir_id, parent_lir_id, REPEAT(' ', nesting * 2) || operator AS operator
  44. FROM mz_internal.mz_lir_mapping mlm
  45. LEFT JOIN mz_introspection.mz_compute_operator_durations_histogram mcodh
  46. ON (mlm.operator_id_start <= mcodh.id AND mcodh.id < mlm.operator_id_end)
  47. GROUP BY global_id, lir_id, operator, parent_lir_id, nesting
  48. ORDER BY global_id, lir_id DESC;
  49. ----
  50. u2 5 NULL Differential␠Join␠%0␠»␠%1
  51. u2 4 5 ␠␠Arrange␠(#0{y})
  52. u2 3 4 ␠␠␠␠Read␠u1
  53. u2 2 5 ␠␠Arrange␠(#0{x})
  54. u2 1 2 ␠␠␠␠Read␠u1
  55. u3 7 NULL Arrange␠(#0{x})
  56. u3 6 7 ␠␠Stream␠u2
  57. # omitting pg_size_pretty(sum(size)) as size
  58. query TIIT
  59. SELECT global_id, lir_id, parent_lir_id, repeat(' ', nesting * 2) || operator AS operator
  60. FROM mz_internal.mz_lir_mapping mlm
  61. LEFT JOIN mz_introspection.mz_arrangement_sizes mas
  62. ON (mlm.operator_id_start <= mas.operator_id AND mas.operator_id < mlm.operator_id_end)
  63. GROUP BY global_id, lir_id, operator, parent_lir_id, nesting
  64. ORDER BY global_id, lir_id DESC;
  65. ----
  66. u2 5 NULL Differential␠Join␠%0␠»␠%1
  67. u2 4 5 ␠␠Arrange␠(#0{y})
  68. u2 3 4 ␠␠␠␠Read␠u1
  69. u2 2 5 ␠␠Arrange␠(#0{x})
  70. u2 1 2 ␠␠␠␠Read␠u1
  71. u3 7 NULL Arrange␠(#0{x})
  72. u3 6 7 ␠␠Stream␠u2
  73. statement ok
  74. DROP TABLE t CASCADE;
  75. # we need the dataflow to actually drop to see the updates
  76. statement ok
  77. SELECT mz_unsafe.mz_sleep(3)
  78. query I
  79. SELECT COUNT(*) FROM mz_internal.mz_dataflow_global_ids;
  80. ----
  81. 0
  82. query I
  83. SELECT COUNT(*) FROM mz_internal.mz_lir_mapping;
  84. ----
  85. 0
  86. # MATERIALIZED VIEW
  87. statement ok
  88. CREATE TABLE u(x INT NOT NULL, y INT, z TEXT);
  89. statement ok
  90. CREATE MATERIALIZED VIEW w AS
  91. SELECT t1.x AS x, t1.z AS z1, t2.z AS z2
  92. FROM u AS t1, u AS t2
  93. WHERE t1.x = t2.y;
  94. # let the introspection sources update
  95. statement ok
  96. SELECT mz_unsafe.mz_sleep(8)
  97. query IT
  98. SELECT id, global_id FROM mz_internal.mz_dataflow_global_ids ORDER BY id, global_id;
  99. ----
  100. 9 t44
  101. query TI
  102. SELECT global_id, lir_id FROM mz_internal.mz_lir_mapping ORDER BY global_id, lir_id DESC;
  103. ----
  104. t44 5
  105. t44 4
  106. t44 3
  107. t44 2
  108. t44 1
  109. ## attribution queries
  110. # omitting sum(duration_ns) as duration, sum(count) as count
  111. query TIIT
  112. SELECT global_id, lir_id, parent_lir_id, REPEAT(' ', nesting * 2) || operator AS operator
  113. FROM mz_internal.mz_lir_mapping mlm
  114. LEFT JOIN mz_introspection.mz_compute_operator_durations_histogram mcodh
  115. ON (mlm.operator_id_start <= mcodh.id AND mcodh.id < mlm.operator_id_end)
  116. GROUP BY global_id, lir_id, operator, parent_lir_id, nesting
  117. ORDER BY global_id, lir_id DESC;
  118. ----
  119. t44 5 NULL Differential␠Join␠%0␠»␠%1
  120. t44 4 5 ␠␠Arrange␠(#0{y})
  121. t44 3 4 ␠␠␠␠Read␠u4
  122. t44 2 5 ␠␠Arrange␠(#0{x})
  123. t44 1 2 ␠␠␠␠Read␠u4
  124. # omitting pg_size_pretty(sum(size)) as size
  125. query TIIT
  126. SELECT global_id, lir_id, parent_lir_id, REPEAT(' ', nesting * 2) || operator AS operator
  127. FROM mz_internal.mz_lir_mapping mlm
  128. LEFT JOIN mz_introspection.mz_arrangement_sizes mas
  129. ON (mlm.operator_id_start <= mas.operator_id AND mas.operator_id < mlm.operator_id_end)
  130. GROUP BY global_id, lir_id, operator, parent_lir_id, nesting
  131. ORDER BY global_id, lir_id DESC;
  132. ----
  133. t44 5 NULL Differential␠Join␠%0␠»␠%1
  134. t44 4 5 ␠␠Arrange␠(#0{y})
  135. t44 3 4 ␠␠␠␠Read␠u4
  136. t44 2 5 ␠␠Arrange␠(#0{x})
  137. t44 1 2 ␠␠␠␠Read␠u4
  138. statement ok
  139. DROP TABLE u CASCADE;
  140. # we need the dataflow to actually drop to see the updates
  141. statement ok
  142. SELECT mz_unsafe.mz_sleep(3)
  143. query I
  144. SELECT COUNT(*) FROM mz_internal.mz_dataflow_global_ids;
  145. ----
  146. 0
  147. query I
  148. SELECT COUNT(*) FROM mz_internal.mz_lir_mapping;
  149. ----
  150. 0
  151. # checking in on bindings
  152. statement ok
  153. CREATE TABLE Person (
  154. creationDate timestamp with time zone NOT NULL,
  155. id bigint,
  156. firstName text NOT NULL,
  157. lastName text NOT NULL,
  158. gender text NOT NULL,
  159. birthday date NOT NULL,
  160. locationIP text NOT NULL,
  161. browserUsed text NOT NULL,
  162. LocationCityId bigint NOT NULL,
  163. speaks text NOT NULL,
  164. email text NOT NULL
  165. )
  166. statement ok
  167. CREATE INDEX Person_id ON Person (id)
  168. statement ok
  169. CREATE INDEX Person_LocationCityId ON Person (LocationCityId)
  170. statement ok
  171. CREATE TABLE Person_knows_Person (
  172. creationDate timestamp with time zone NOT NULL,
  173. Person1id bigint NOT NULL,
  174. Person2id bigint NOT NULL
  175. )
  176. statement ok
  177. CREATE INDEX Person_knows_Person_Person1id ON Person_knows_Person (Person1id)
  178. statement ok
  179. CREATE INDEX Person_knows_Person_Person2id ON person_knows_person (Person2id)
  180. statement ok
  181. CREATE INDEX Person_knows_Person_Person1id_Person2id ON Person_knows_Person (Person1id, Person2id)
  182. statement ok
  183. CREATE TABLE Post (
  184. creationDate timestamp with time zone NOT NULL,
  185. id bigint NOT NULL,
  186. imageFile text,
  187. locationIP text NOT NULL,
  188. browserUsed text NOT NULL,
  189. language text,
  190. content text,
  191. length int NOT NULL,
  192. CreatorPersonId bigint NOT NULL,
  193. ContainerForumId bigint NOT NULL,
  194. LocationCountryId bigint NOT NULL
  195. )
  196. statement ok
  197. CREATE INDEX Post_id ON Post (id)
  198. statement ok
  199. CREATE TABLE Comment (
  200. creationDate timestamp with time zone NOT NULL,
  201. id bigint NOT NULL,
  202. locationIP text NOT NULL,
  203. browserUsed text NOT NULL,
  204. content text NOT NULL,
  205. length int NOT NULL,
  206. CreatorPersonId bigint NOT NULL,
  207. LocationCountryId bigint NOT NULL,
  208. ParentPostId bigint,
  209. ParentCommentId bigint
  210. )
  211. statement ok
  212. CREATE INDEX Comment_id ON Comment (id)
  213. statement ok
  214. CREATE OR REPLACE MATERIALIZED VIEW Message AS
  215. WITH MUTUALLY RECURSIVE
  216. -- compute the transitive closure (with root information) using minimnal info
  217. roots (MessageId bigint, RootPostId bigint, RootPostLanguage text, ContainerForumId bigint, ParentMessageId bigint) AS
  218. ( SELECT id AS MessageId, id AS RootPostId, language AS RootPostLanguage, ContainerForumId, NULL::bigint AS ParentMessageId FROM Post
  219. UNION SELECT
  220. Comment.id AS MessageId,
  221. ParentPostId AS RootPostId,
  222. language AS RootPostLanguage,
  223. Post.ContainerForumId AS ContainerForumId,
  224. ParentPostId AS ParentMessageId
  225. FROM Comment
  226. JOIN Post
  227. ON Comment.ParentPostId = Post.id),
  228. ms (MessageId bigint, RootPostId bigint, RootPostLanguage text, ContainerForumId bigint, ParentMessageId bigint) AS
  229. ( SELECT *
  230. FROM roots
  231. UNION SELECT
  232. Comment.id AS MessageId,
  233. ms.RootPostId AS RootPostId,
  234. ms.RootPostLanguage AS RootPostLanguage,
  235. ms.ContainerForumId AS ContainerForumId,
  236. ParentCommentId AS ParentMessageId
  237. FROM Comment
  238. JOIN ms
  239. ON ParentCommentId = ms.MessageId)
  240. -- now do the late materialization
  241. ( SELECT
  242. creationDate,
  243. id AS MessageId,
  244. id AS RootPostId,
  245. language AS RootPostLanguage,
  246. content,
  247. imageFile,
  248. locationIP,
  249. browserUsed,
  250. length,
  251. CreatorPersonId,
  252. ContainerForumId,
  253. LocationCountryId,
  254. NULL::bigint AS ParentMessageId
  255. FROM Post
  256. UNION (SELECT
  257. Comment.creationDate AS creationDate,
  258. Comment.id AS MessageId,
  259. ms.RootPostId AS RootPostId,
  260. ms.RootPostLanguage AS RootPostLanguage,
  261. Comment.content AS content,
  262. NULL::text AS imageFile,
  263. Comment.locationIP AS locationIP,
  264. Comment.browserUsed AS browserUsed,
  265. Comment.length AS length,
  266. Comment.CreatorPersonId AS CreatorPersonId,
  267. ms.ContainerForumId AS ContainerForumId,
  268. Comment.LocationCountryId AS LocationCityId,
  269. ms.ParentMessageId AS ParentMessageId
  270. FROM Comment
  271. JOIN ms
  272. ON Comment.id = ms.MessageId))
  273. statement ok
  274. CREATE INDEX Message_MessageId ON Message (MessageId)
  275. statement ok
  276. CREATE INDEX Message_ParentMessageId ON Message (ParentMessageId)
  277. statement ok
  278. CREATE INDEX Message_CreatorPersonId ON Message (CreatorPersonId)
  279. statement ok
  280. CREATE VIEW PathQ19 AS
  281. WITH
  282. -- asymmetrize...
  283. knows_asymmetric AS (
  284. SELECT person1id, person2id
  285. FROM Person_knows_person
  286. WHERE person1id < person2id
  287. ),
  288. -- compute interaction scores (no interactions means we ignore that 'knows' relationship)
  289. weights(src, dst, w) AS (
  290. SELECT
  291. person1id AS src,
  292. person2id AS dst,
  293. greatest(round(40 - sqrt(count(*)))::bigint, 1) AS w
  294. FROM Message m1,
  295. Message m2,
  296. knows_asymmetric pp
  297. WHERE pp.person1id = least(m1.creatorpersonid, m2.creatorpersonid)
  298. AND pp.person2id = greatest(m1.creatorpersonid, m2.creatorpersonid)
  299. AND m1.parentmessageid = m2.messageid
  300. AND m1.creatorpersonid <> m2.creatorpersonid
  301. GROUP BY src, dst
  302. )
  303. -- resymmetrize
  304. SELECT src, dst, w FROM weights
  305. UNION ALL
  306. SELECT dst, src, w FROM weights;
  307. statement ok
  308. CREATE INDEX PathQ19_src ON PathQ19 (src);
  309. statement ok
  310. CREATE VIEW ldbc_q19 AS
  311. WITH MUTUALLY RECURSIVE
  312. -- Source and destination identifiers, which do not evolve recursively.
  313. srcs (f bigint) AS (SELECT id FROM Person WHERE locationcityid = 655::bigint),
  314. dsts (t bigint) AS (SELECT id FROM Person WHERE locationcityid = 1138::bigint),
  315. -- Only work off of nodes not more than half a viable path.
  316. active_forward(src bigint, dst bigint, w double precision) AS (
  317. SELECT * FROM forward WHERE coalesce (w < (SELECT w/2 FROM shortest), true)
  318. ),
  319. forward (src bigint, dst bigint, w double precision) AS (
  320. SELECT DISTINCT ON (src, dst) src, dst, w
  321. FROM (
  322. SELECT f as src, f as dst, 0.0 as w FROM srcs
  323. UNION ALL
  324. SELECT f.src, p.dst, f.w + p.w
  325. FROM active_forward f, PathQ19 p
  326. WHERE f.dst = p.src
  327. )
  328. ORDER BY src, dst, w
  329. ),
  330. -- Only work off of nodes not more than half a viable path.
  331. active_reverse(src bigint, dst bigint, w double precision) AS (
  332. SELECT * FROM reverse WHERE coalesce (w < (SELECT w/2 FROM shortest), true)
  333. ),
  334. reverse (src bigint, dst bigint, w double precision) AS (
  335. SELECT DISTINCT ON (src, dst) src, dst, w
  336. FROM (
  337. SELECT t as src, t as dst, 0.0 as w FROM dsts
  338. UNION ALL
  339. SELECT r.src, p.dst, r.w + p.w
  340. FROM active_reverse r, PathQ19 p
  341. WHERE r.dst = p.src
  342. )
  343. ORDER BY src, dst, w
  344. ),
  345. -- Once we find a path from `f` to `t` it appears here.
  346. paths (f bigint, t bigint, w double precision) AS (
  347. SELECT l.src as f, r.src as t, min(l.w + r.w) AS w
  348. FROM forward l, reverse r
  349. WHERE l.dst = r.dst
  350. GROUP BY l.src, r.src
  351. ),
  352. shortest (w double precision) AS (
  353. SELECT min(w) FROM paths
  354. )
  355. SELECT f, t, w
  356. FROM paths
  357. WHERE w = (SELECT MIN(w) FROM paths);
  358. statement ok
  359. CREATE INDEX ldbc_q19_idx ON ldbc_q19 (f);
  360. statement ok
  361. SELECT mz_unsafe.mz_sleep(2)
  362. query TT
  363. SELECT global_id, REPEAT(' ', nesting * 2) || operator AS operator
  364. FROM mz_internal.mz_lir_mapping mlm
  365. ORDER BY global_id, lir_id DESC;
  366. ----
  367. t69 Returning␠Distinct␠GroupAggregate
  368. t69 ␠␠Union
  369. t69 ␠␠␠␠Differential␠Join␠%0␠»␠%1
  370. t69 ␠␠␠␠␠␠Arrange␠(#0{messageid})
  371. t69 ␠␠␠␠␠␠␠␠Stream␠l0
  372. t69 ␠␠␠␠␠␠Arranged␠u15
  373. t69 ␠␠␠␠Arranged␠u13
  374. t69 With␠Recursive␠l0␠=␠Unarranged␠Raw␠Stream
  375. t69 ␠␠Distinct␠GroupAggregate
  376. t69 ␠␠␠␠Union
  377. t69 ␠␠␠␠␠␠Differential␠Join␠%0␠»␠%1
  378. t69 ␠␠␠␠␠␠␠␠Arrange␠(#0{messageid})
  379. t69 ␠␠␠␠␠␠␠␠␠␠Read␠l0
  380. t69 ␠␠␠␠␠␠␠␠Arrange␠(#1{parentcommentid})
  381. t69 ␠␠␠␠␠␠␠␠␠␠Arranged␠u15
  382. t69 ␠␠␠␠␠␠Differential␠Join␠%1␠»␠%0
  383. t69 ␠␠␠␠␠␠␠␠Arranged␠u13
  384. t69 ␠␠␠␠␠␠␠␠Arrange␠(#1{parentpostid})
  385. t69 ␠␠␠␠␠␠␠␠␠␠Arranged␠u15
  386. t69 ␠␠␠␠␠␠Arranged␠u13
  387. u10 Arrange␠(#1{person1id})
  388. u10 ␠␠Stream␠u9
  389. u11 Arrange␠(#2{person2id})
  390. u11 ␠␠Arranged␠u9
  391. u12 Arrange␠(#1{person1id},␠#2{person2id})
  392. u12 ␠␠Arranged␠u9
  393. u14 Arrange␠(#1{id})
  394. u14 ␠␠Stream␠u13
  395. u16 Arrange␠(#1{id})
  396. u16 ␠␠Stream␠u15
  397. u18 Arrange␠(#1{messageid})
  398. u18 ␠␠Stream␠u17
  399. u19 Arrange␠(#12{parentmessageid})
  400. u19 ␠␠Arranged␠u17
  401. u20 Arrange␠(#9{creatorpersonid})
  402. u20 ␠␠Arranged␠u17
  403. u21 Returning␠Union
  404. u21 ␠␠Read␠l0
  405. u21 ␠␠Stream␠l0
  406. u21 With␠l0␠=␠Map/Filter/Project
  407. u21 ␠␠Accumulable␠GroupAggregate
  408. u21 ␠␠␠␠Delta␠Join␠[%0␠»␠%1␠»␠%2][%1␠»␠%0␠»␠%2][%2␠»␠%0␠»␠%1]
  409. u21 ␠␠␠␠␠␠Arranged␠u9
  410. u21 ␠␠␠␠␠␠Arranged␠u17
  411. u21 ␠␠␠␠␠␠Arrange␠(empty␠key)␠(#1{parentmessageid})
  412. u21 ␠␠␠␠␠␠␠␠Arranged␠u17
  413. u22 Arrange␠(#0{src})
  414. u22 ␠␠Stream␠u21
  415. u23 Returning␠Differential␠Join␠%1␠»␠%0
  416. u23 ␠␠Arrange␠(#0)
  417. u23 ␠␠␠␠Bucketed␠Hierarchical␠GroupAggregate␠(buckets:␠268435456␠16777216␠1048576␠65536␠4096␠256␠16)
  418. u23 ␠␠␠␠␠␠Read␠l5
  419. u23 ␠␠Arrange␠(#2{w})
  420. u23 ␠␠␠␠Stream␠l5
  421. u23 With␠Recursive␠l7␠=␠Union
  422. u23 ␠␠Map/Filter/Project
  423. u23 ␠␠␠␠Consolidating␠Union
  424. u23 ␠␠␠␠␠␠Constant␠(1␠rows)
  425. u23 ␠␠␠␠␠␠Negate␠Diffs
  426. u23 ␠␠␠␠␠␠␠␠Arranged␠l6
  427. u23 ␠␠Arranged␠l6
  428. u23 l6␠=␠Unarranged␠Raw␠Stream
  429. u23 ␠␠Bucketed␠Hierarchical␠GroupAggregate␠(buckets:␠268435456␠16777216␠1048576␠65536␠4096␠256␠16)
  430. u23 ␠␠␠␠Arranged␠l5
  431. u23 l5␠=␠Unarranged␠Raw␠Stream
  432. u23 ␠␠Bucketed␠Hierarchical␠GroupAggregate␠(buckets:␠268435456␠16777216␠1048576␠65536␠4096␠256␠16)
  433. u23 ␠␠␠␠Differential␠Join␠%0␠»␠%1
  434. u23 ␠␠␠␠␠␠Arrange␠(#1{dst})
  435. u23 ␠␠␠␠␠␠␠␠Read␠l4
  436. u23 ␠␠␠␠␠␠Arrange␠(#1{dst})
  437. u23 ␠␠␠␠␠␠␠␠Read␠l3
  438. u23 l4␠=␠Non-monotonic␠TopK
  439. u23 ␠␠Union
  440. u23 ␠␠␠␠Delta␠Join␠[%0␠»␠%2␠»␠%1][%1␠»␠%0␠»␠%2][%2␠»␠%0␠»␠%1]
  441. u23 ␠␠␠␠␠␠Arranged␠l1
  442. u23 ␠␠␠␠␠␠Arranged␠l2
  443. u23 ␠␠␠␠␠␠Arrange␠(empty␠key)␠(#1{dst})
  444. u23 ␠␠␠␠␠␠␠␠Read␠l4
  445. u23 ␠␠␠␠Differential␠Join␠%1␠»␠%0
  446. u23 ␠␠␠␠␠␠Arrange␠(#0)
  447. u23 ␠␠␠␠␠␠␠␠Constant␠(1␠rows)
  448. u23 ␠␠␠␠␠␠Arranged␠l0
  449. u23 l3␠=␠Non-monotonic␠TopK
  450. u23 ␠␠Union
  451. u23 ␠␠␠␠Delta␠Join␠[%0␠»␠%2␠»␠%1][%1␠»␠%0␠»␠%2][%2␠»␠%0␠»␠%1]
  452. u23 ␠␠␠␠␠␠Arranged␠l1
  453. u23 ␠␠␠␠␠␠Arranged␠l2
  454. u23 ␠␠␠␠␠␠Arrange␠(empty␠key)␠(#1{dst})
  455. u23 ␠␠␠␠␠␠␠␠Read␠l3
  456. u23 ␠␠␠␠Differential␠Join␠%1␠»␠%0
  457. u23 ␠␠␠␠␠␠Arrange␠(#0)
  458. u23 ␠␠␠␠␠␠␠␠Constant␠(1␠rows)
  459. u23 ␠␠␠␠␠␠Arranged␠l0
  460. u23 l2␠=␠Arrange␠(empty␠key)
  461. u23 ␠␠Union
  462. u23 ␠␠␠␠Map/Filter/Project
  463. u23 ␠␠␠␠␠␠Consolidating␠Union
  464. u23 ␠␠␠␠␠␠␠␠Constant␠(1␠rows)
  465. u23 ␠␠␠␠␠␠␠␠Negate␠Diffs
  466. u23 ␠␠␠␠␠␠␠␠␠␠Read␠l7
  467. u23 ␠␠␠␠Read␠l7
  468. u23 With␠l1␠=␠Arranged␠u21
  469. u23 l0␠=␠Arranged␠u6
  470. u24 Arrange␠(#0{f})
  471. u24 ␠␠Stream␠u23
  472. u7 Arrange␠(#1{id})
  473. u7 ␠␠Stream␠u6
  474. u8 Arrange␠(#8{locationcityid})
  475. u8 ␠␠Arranged␠u6
  476. statement ok
  477. DROP TABLE Person, Person_knows_Person, Post, Comment CASCADE;
  478. # ATTRIBUTING TOP K HINTS
  479. statement ok
  480. CREATE TABLE t(x INT NOT NULL, y INT, z TEXT);
  481. statement ok
  482. CREATE VIEW v2 AS SELECT DISTINCT ON(x, y) * FROM t ORDER BY x, y;
  483. statement ok
  484. CREATE INDEX v2_idx_x ON v2(x);
  485. statement ok
  486. SELECT mz_unsafe.mz_sleep(8)
  487. query TIITIIIT
  488. SELECT mlm.global_id AS global_id, lir_id, parent_lir_id, REPEAT(' ', nesting * 2) || operator AS operator, levels, to_cut, savings, hint
  489. FROM mz_internal.mz_lir_mapping mlm
  490. JOIN mz_introspection.mz_dataflow_global_ids mdgi
  491. ON (mlm.global_id = mdgi.global_id)
  492. LEFT JOIN mz_introspection.mz_expected_group_size_advice megsa
  493. ON (megsa.dataflow_id = mdgi.id AND
  494. mlm.operator_id_start <= megsa.region_id AND megsa.region_id < mlm.operator_id_end)
  495. ORDER BY mlm.global_id, lir_id DESC;
  496. ----
  497. u26 2 NULL Non-monotonic␠TopK 8 7 3808 15.000
  498. u26 1 2 ␠␠Stream␠u25 NULL NULL NULL NULL
  499. u27 4 NULL Arrange␠(#0{x}) NULL NULL NULL NULL
  500. u27 3 4 ␠␠Stream␠u26 NULL NULL NULL NULL
  501. # rebuild everything other stuff, make sure it all shows up as mappable objects
  502. statement ok
  503. CREATE VIEW v AS
  504. SELECT t1.x AS x, t1.z AS z1, t2.z AS z2
  505. FROM t AS t1, t AS t2
  506. WHERE t1.x = t2.y;
  507. statement ok
  508. CREATE INDEX v_idx_x ON v(x);
  509. statement ok
  510. CREATE TABLE u(x INT NOT NULL, y INT, z TEXT);
  511. statement ok
  512. CREATE MATERIALIZED VIEW w AS
  513. SELECT t1.x AS x, t1.z AS z1, t2.z AS z2
  514. FROM u AS t1, u AS t2
  515. WHERE t1.x = t2.y;
  516. statement ok
  517. SELECT mz_unsafe.mz_sleep(8)
  518. query TTI rowsort
  519. SELECT name, global_id, COUNT(lir_id)
  520. FROM mz_introspection.mz_mappable_objects LEFT JOIN mz_introspection.mz_lir_mapping
  521. USING (global_id)
  522. GROUP BY name, global_id;
  523. ----
  524. materialize.public.v2_idx_x u26 2
  525. materialize.public.v2_idx_x u27 2
  526. materialize.public.v_idx_x u28 5
  527. materialize.public.v_idx_x u29 2
  528. materialize.public.w t82 5
  529. # explain analyze SQL generate
  530. query T multiline
  531. EXPLAIN ANALYZE MEMORY FOR MATERIALIZED VIEW w AS SQL;
  532. ----
  533. WITH
  534. summary_memory AS
  535. (
  536. SELECT
  537. mlm.global_id AS global_id,
  538. mlm.lir_id AS lir_id,
  539. sum(mas.size) AS total_memory,
  540. sum(mas.records) AS total_records,
  541. CASE
  542. WHEN count(DISTINCT mas.worker_id) <> 0
  543. THEN sum(mas.size) / count(DISTINCT mas.worker_id)
  544. ELSE NULL
  545. END
  546. AS avg_memory,
  547. CASE
  548. WHEN count(DISTINCT mas.worker_id) <> 0
  549. THEN
  550. sum(mas.records) / count(DISTINCT mas.worker_id)
  551. ELSE NULL
  552. END
  553. AS avg_records
  554. FROM
  555. mz_introspection.mz_lir_mapping AS mlm
  556. JOIN
  557. mz_introspection.mz_arrangement_sizes_per_worker AS mas
  558. ON
  559. (
  560. mlm.operator_id_start <= mas.operator_id
  561. AND
  562. mas.operator_id < mlm.operator_id_end
  563. )
  564. GROUP BY mlm.global_id, mlm.lir_id
  565. )
  566. SELECT
  567. repeat(' ', nesting * 2) || operator AS operator,
  568. pg_size_pretty(sm.total_memory) AS total_memory,
  569. sm.total_records AS total_records
  570. FROM
  571. mz_introspection.mz_lir_mapping AS mlm
  572. LEFT JOIN summary_memory AS sm USING(global_id, lir_id)
  573. JOIN
  574. mz_introspection.mz_mappable_objects AS mo
  575. ON (mlm.global_id = mo.global_id)
  576. WHERE mo.name = 'materialize.public.w'
  577. ORDER BY mlm.lir_id DESC;
  578. EOF
  579. query T multiline
  580. EXPLAIN ANALYZE CPU FOR MATERIALIZED VIEW w AS SQL;
  581. ----
  582. WITH
  583. summary_cpu AS
  584. (
  585. SELECT
  586. mlm.global_id AS global_id,
  587. mlm.lir_id AS lir_id,
  588. sum(mse.elapsed_ns) AS total_ns,
  589. CASE
  590. WHEN count(DISTINCT mse.worker_id) <> 0
  591. THEN
  592. sum(mse.elapsed_ns)
  593. / count(DISTINCT mse.worker_id)
  594. ELSE NULL
  595. END
  596. AS avg_ns
  597. FROM
  598. mz_introspection.mz_lir_mapping AS mlm
  599. JOIN
  600. mz_introspection.mz_scheduling_elapsed_per_worker AS mse
  601. ON
  602. (
  603. mlm.operator_id_start <= mse.id
  604. AND
  605. mse.id < mlm.operator_id_end
  606. )
  607. GROUP BY mlm.global_id, mlm.lir_id
  608. )
  609. SELECT
  610. repeat(' ', nesting * 2) || operator AS operator,
  611. sc.total_ns / 1000 * '1 microsecond'::interval AS total_elapsed
  612. FROM
  613. mz_introspection.mz_lir_mapping AS mlm
  614. LEFT JOIN summary_cpu AS sc USING(global_id, lir_id)
  615. JOIN
  616. mz_introspection.mz_mappable_objects AS mo
  617. ON (mlm.global_id = mo.global_id)
  618. WHERE mo.name = 'materialize.public.w'
  619. ORDER BY mlm.lir_id DESC;
  620. EOF
  621. query T multiline
  622. EXPLAIN ANALYZE MEMORY, CPU FOR MATERIALIZED VIEW w AS SQL;
  623. ----
  624. WITH
  625. summary_memory AS
  626. (
  627. SELECT
  628. mlm.global_id AS global_id,
  629. mlm.lir_id AS lir_id,
  630. sum(mas.size) AS total_memory,
  631. sum(mas.records) AS total_records,
  632. CASE
  633. WHEN count(DISTINCT mas.worker_id) <> 0
  634. THEN sum(mas.size) / count(DISTINCT mas.worker_id)
  635. ELSE NULL
  636. END
  637. AS avg_memory,
  638. CASE
  639. WHEN count(DISTINCT mas.worker_id) <> 0
  640. THEN
  641. sum(mas.records) / count(DISTINCT mas.worker_id)
  642. ELSE NULL
  643. END
  644. AS avg_records
  645. FROM
  646. mz_introspection.mz_lir_mapping AS mlm
  647. JOIN
  648. mz_introspection.mz_arrangement_sizes_per_worker AS mas
  649. ON
  650. (
  651. mlm.operator_id_start <= mas.operator_id
  652. AND
  653. mas.operator_id < mlm.operator_id_end
  654. )
  655. GROUP BY mlm.global_id, mlm.lir_id
  656. ),
  657. summary_cpu AS
  658. (
  659. SELECT
  660. mlm.global_id AS global_id,
  661. mlm.lir_id AS lir_id,
  662. sum(mse.elapsed_ns) AS total_ns,
  663. CASE
  664. WHEN count(DISTINCT mse.worker_id) <> 0
  665. THEN
  666. sum(mse.elapsed_ns)
  667. / count(DISTINCT mse.worker_id)
  668. ELSE NULL
  669. END
  670. AS avg_ns
  671. FROM
  672. mz_introspection.mz_lir_mapping AS mlm
  673. JOIN
  674. mz_introspection.mz_scheduling_elapsed_per_worker AS mse
  675. ON
  676. (
  677. mlm.operator_id_start <= mse.id
  678. AND
  679. mse.id < mlm.operator_id_end
  680. )
  681. GROUP BY mlm.global_id, mlm.lir_id
  682. )
  683. SELECT
  684. repeat(' ', nesting * 2) || operator AS operator,
  685. pg_size_pretty(sm.total_memory) AS total_memory,
  686. sm.total_records AS total_records,
  687. sc.total_ns / 1000 * '1 microsecond'::interval AS total_elapsed
  688. FROM
  689. mz_introspection.mz_lir_mapping AS mlm
  690. LEFT JOIN summary_memory AS sm USING(global_id, lir_id)
  691. LEFT JOIN summary_cpu AS sc USING(global_id, lir_id)
  692. JOIN
  693. mz_introspection.mz_mappable_objects AS mo
  694. ON (mlm.global_id = mo.global_id)
  695. WHERE mo.name = 'materialize.public.w'
  696. ORDER BY mlm.lir_id DESC;
  697. EOF
  698. query T multiline
  699. EXPLAIN ANALYZE MEMORY, CPU WITH SKEW FOR MATERIALIZED VIEW w AS SQL;
  700. ----
  701. WITH
  702. summary_memory AS
  703. (
  704. SELECT
  705. mlm.global_id AS global_id,
  706. mlm.lir_id AS lir_id,
  707. sum(mas.size) AS total_memory,
  708. sum(mas.records) AS total_records,
  709. CASE
  710. WHEN count(DISTINCT mas.worker_id) <> 0
  711. THEN sum(mas.size) / count(DISTINCT mas.worker_id)
  712. ELSE NULL
  713. END
  714. AS avg_memory,
  715. CASE
  716. WHEN count(DISTINCT mas.worker_id) <> 0
  717. THEN
  718. sum(mas.records) / count(DISTINCT mas.worker_id)
  719. ELSE NULL
  720. END
  721. AS avg_records
  722. FROM
  723. mz_introspection.mz_lir_mapping AS mlm
  724. JOIN
  725. mz_introspection.mz_arrangement_sizes_per_worker AS mas
  726. ON
  727. (
  728. mlm.operator_id_start <= mas.operator_id
  729. AND
  730. mas.operator_id < mlm.operator_id_end
  731. )
  732. GROUP BY mlm.global_id, mlm.lir_id
  733. ),
  734. per_worker_memory AS
  735. (
  736. SELECT
  737. mlm.global_id AS global_id,
  738. mlm.lir_id AS lir_id,
  739. mas.worker_id AS worker_id,
  740. sum(mas.size) AS worker_memory,
  741. sum(mas.records) AS worker_records
  742. FROM
  743. mz_introspection.mz_lir_mapping AS mlm
  744. JOIN
  745. mz_introspection.mz_arrangement_sizes_per_worker AS mas
  746. ON
  747. (
  748. mlm.operator_id_start <= mas.operator_id
  749. AND
  750. mas.operator_id < mlm.operator_id_end
  751. )
  752. GROUP BY mlm.global_id, mlm.lir_id, mas.worker_id
  753. ),
  754. summary_cpu AS
  755. (
  756. SELECT
  757. mlm.global_id AS global_id,
  758. mlm.lir_id AS lir_id,
  759. sum(mse.elapsed_ns) AS total_ns,
  760. CASE
  761. WHEN count(DISTINCT mse.worker_id) <> 0
  762. THEN
  763. sum(mse.elapsed_ns)
  764. / count(DISTINCT mse.worker_id)
  765. ELSE NULL
  766. END
  767. AS avg_ns
  768. FROM
  769. mz_introspection.mz_lir_mapping AS mlm
  770. JOIN
  771. mz_introspection.mz_scheduling_elapsed_per_worker AS mse
  772. ON
  773. (
  774. mlm.operator_id_start <= mse.id
  775. AND
  776. mse.id < mlm.operator_id_end
  777. )
  778. GROUP BY mlm.global_id, mlm.lir_id
  779. ),
  780. per_worker_cpu AS
  781. (
  782. SELECT
  783. mlm.global_id AS global_id,
  784. mlm.lir_id AS lir_id,
  785. mse.worker_id AS worker_id,
  786. sum(mse.elapsed_ns) AS worker_ns
  787. FROM
  788. mz_introspection.mz_lir_mapping AS mlm
  789. JOIN
  790. mz_introspection.mz_scheduling_elapsed_per_worker AS mse
  791. ON
  792. (
  793. mlm.operator_id_start <= mse.id
  794. AND
  795. mse.id < mlm.operator_id_end
  796. )
  797. GROUP BY mlm.global_id, mlm.lir_id, mse.worker_id
  798. )
  799. SELECT
  800. repeat(' ', nesting * 2) || operator AS operator,
  801. pwm.worker_id AS worker_id,
  802. CASE
  803. WHEN pwm.worker_id IS NOT NULL AND sm.avg_memory <> 0
  804. THEN round(pwm.worker_memory / sm.avg_memory, 2)
  805. ELSE NULL
  806. END
  807. AS memory_ratio,
  808. pg_size_pretty(pwm.worker_memory) AS worker_memory,
  809. pg_size_pretty(sm.avg_memory) AS avg_memory,
  810. pg_size_pretty(sm.total_memory) AS total_memory,
  811. CASE
  812. WHEN pwm.worker_id IS NOT NULL AND sm.avg_records <> 0
  813. THEN round(pwm.worker_records / sm.avg_records, 2)
  814. ELSE NULL
  815. END
  816. AS records_ratio,
  817. pwm.worker_records AS worker_records,
  818. sm.avg_records AS avg_records,
  819. sm.total_records AS total_records,
  820. CASE
  821. WHEN pwc.worker_id IS NOT NULL AND sc.avg_ns <> 0
  822. THEN round(pwc.worker_ns / sc.avg_ns, 2)
  823. ELSE NULL
  824. END
  825. AS cpu_ratio,
  826. pwc.worker_ns / 1000 * '1 microsecond'::interval AS worker_elapsed,
  827. sc.avg_ns / 1000 * '1 microsecond'::interval AS avg_elapsed,
  828. sc.total_ns / 1000 * '1 microsecond'::interval AS total_elapsed
  829. FROM
  830. mz_introspection.mz_lir_mapping AS mlm
  831. LEFT JOIN summary_memory AS sm USING(global_id, lir_id)
  832. LEFT JOIN per_worker_memory AS pwm USING(global_id, lir_id)
  833. LEFT JOIN summary_cpu AS sc USING(global_id, lir_id)
  834. LEFT JOIN per_worker_cpu AS pwc USING(global_id, lir_id)
  835. JOIN
  836. mz_introspection.mz_mappable_objects AS mo
  837. ON (mlm.global_id = mo.global_id)
  838. WHERE mo.name = 'materialize.public.w' AND pwc.worker_id = pwm.worker_id
  839. ORDER BY mlm.lir_id DESC, worker_id;
  840. EOF
  841. query T multiline
  842. EXPLAIN ANALYZE CPU, MEMORY WITH SKEW FOR MATERIALIZED VIEW w AS SQL;
  843. ----
  844. WITH
  845. summary_cpu AS
  846. (
  847. SELECT
  848. mlm.global_id AS global_id,
  849. mlm.lir_id AS lir_id,
  850. sum(mse.elapsed_ns) AS total_ns,
  851. CASE
  852. WHEN count(DISTINCT mse.worker_id) <> 0
  853. THEN
  854. sum(mse.elapsed_ns)
  855. / count(DISTINCT mse.worker_id)
  856. ELSE NULL
  857. END
  858. AS avg_ns
  859. FROM
  860. mz_introspection.mz_lir_mapping AS mlm
  861. JOIN
  862. mz_introspection.mz_scheduling_elapsed_per_worker AS mse
  863. ON
  864. (
  865. mlm.operator_id_start <= mse.id
  866. AND
  867. mse.id < mlm.operator_id_end
  868. )
  869. GROUP BY mlm.global_id, mlm.lir_id
  870. ),
  871. per_worker_cpu AS
  872. (
  873. SELECT
  874. mlm.global_id AS global_id,
  875. mlm.lir_id AS lir_id,
  876. mse.worker_id AS worker_id,
  877. sum(mse.elapsed_ns) AS worker_ns
  878. FROM
  879. mz_introspection.mz_lir_mapping AS mlm
  880. JOIN
  881. mz_introspection.mz_scheduling_elapsed_per_worker AS mse
  882. ON
  883. (
  884. mlm.operator_id_start <= mse.id
  885. AND
  886. mse.id < mlm.operator_id_end
  887. )
  888. GROUP BY mlm.global_id, mlm.lir_id, mse.worker_id
  889. ),
  890. summary_memory AS
  891. (
  892. SELECT
  893. mlm.global_id AS global_id,
  894. mlm.lir_id AS lir_id,
  895. sum(mas.size) AS total_memory,
  896. sum(mas.records) AS total_records,
  897. CASE
  898. WHEN count(DISTINCT mas.worker_id) <> 0
  899. THEN sum(mas.size) / count(DISTINCT mas.worker_id)
  900. ELSE NULL
  901. END
  902. AS avg_memory,
  903. CASE
  904. WHEN count(DISTINCT mas.worker_id) <> 0
  905. THEN
  906. sum(mas.records) / count(DISTINCT mas.worker_id)
  907. ELSE NULL
  908. END
  909. AS avg_records
  910. FROM
  911. mz_introspection.mz_lir_mapping AS mlm
  912. JOIN
  913. mz_introspection.mz_arrangement_sizes_per_worker AS mas
  914. ON
  915. (
  916. mlm.operator_id_start <= mas.operator_id
  917. AND
  918. mas.operator_id < mlm.operator_id_end
  919. )
  920. GROUP BY mlm.global_id, mlm.lir_id
  921. ),
  922. per_worker_memory AS
  923. (
  924. SELECT
  925. mlm.global_id AS global_id,
  926. mlm.lir_id AS lir_id,
  927. mas.worker_id AS worker_id,
  928. sum(mas.size) AS worker_memory,
  929. sum(mas.records) AS worker_records
  930. FROM
  931. mz_introspection.mz_lir_mapping AS mlm
  932. JOIN
  933. mz_introspection.mz_arrangement_sizes_per_worker AS mas
  934. ON
  935. (
  936. mlm.operator_id_start <= mas.operator_id
  937. AND
  938. mas.operator_id < mlm.operator_id_end
  939. )
  940. GROUP BY mlm.global_id, mlm.lir_id, mas.worker_id
  941. )
  942. SELECT
  943. repeat(' ', nesting * 2) || operator AS operator,
  944. pwc.worker_id AS worker_id,
  945. CASE
  946. WHEN pwc.worker_id IS NOT NULL AND sc.avg_ns <> 0
  947. THEN round(pwc.worker_ns / sc.avg_ns, 2)
  948. ELSE NULL
  949. END
  950. AS cpu_ratio,
  951. pwc.worker_ns / 1000 * '1 microsecond'::interval AS worker_elapsed,
  952. sc.avg_ns / 1000 * '1 microsecond'::interval AS avg_elapsed,
  953. sc.total_ns / 1000 * '1 microsecond'::interval AS total_elapsed,
  954. CASE
  955. WHEN pwm.worker_id IS NOT NULL AND sm.avg_memory <> 0
  956. THEN round(pwm.worker_memory / sm.avg_memory, 2)
  957. ELSE NULL
  958. END
  959. AS memory_ratio,
  960. pg_size_pretty(pwm.worker_memory) AS worker_memory,
  961. pg_size_pretty(sm.avg_memory) AS avg_memory,
  962. pg_size_pretty(sm.total_memory) AS total_memory,
  963. CASE
  964. WHEN pwm.worker_id IS NOT NULL AND sm.avg_records <> 0
  965. THEN round(pwm.worker_records / sm.avg_records, 2)
  966. ELSE NULL
  967. END
  968. AS records_ratio,
  969. pwm.worker_records AS worker_records,
  970. sm.avg_records AS avg_records,
  971. sm.total_records AS total_records
  972. FROM
  973. mz_introspection.mz_lir_mapping AS mlm
  974. LEFT JOIN summary_cpu AS sc USING(global_id, lir_id)
  975. LEFT JOIN per_worker_cpu AS pwc USING(global_id, lir_id)
  976. LEFT JOIN summary_memory AS sm USING(global_id, lir_id)
  977. LEFT JOIN per_worker_memory AS pwm USING(global_id, lir_id)
  978. JOIN
  979. mz_introspection.mz_mappable_objects AS mo
  980. ON (mlm.global_id = mo.global_id)
  981. WHERE mo.name = 'materialize.public.w' AND pwm.worker_id = pwc.worker_id
  982. ORDER BY mlm.lir_id DESC, worker_id;
  983. EOF
  984. # we can actually look at real hints here, because it'll be stable
  985. query TIIIT
  986. EXPLAIN ANALYZE HINTS FOR INDEX v2_idx_x;
  987. ----
  988. Arrange␠(#0{x}) NULL NULL NULL NULL
  989. ␠␠Stream␠u26 NULL NULL NULL NULL
  990. Non-monotonic␠TopK 8 7 15 3808␠bytes
  991. ␠␠Stream␠u25 NULL NULL NULL NULL
  992. query T multiline
  993. EXPLAIN ANALYZE HINTS FOR INDEX v2_idx_x AS SQL;
  994. ----
  995. SELECT
  996. repeat(' ', nesting * 2) || operator AS operator,
  997. megsa.levels AS levels,
  998. megsa.to_cut AS to_cut,
  999. megsa.hint AS hint,
  1000. pg_size_pretty(savings) AS savings
  1001. FROM
  1002. mz_introspection.mz_lir_mapping AS mlm
  1003. JOIN
  1004. mz_introspection.mz_dataflow_global_ids AS mdgi
  1005. ON (mlm.global_id = mdgi.global_id)
  1006. LEFT JOIN
  1007. mz_introspection.mz_expected_group_size_advice AS megsa
  1008. ON
  1009. (
  1010. megsa.dataflow_id = mdgi.id
  1011. AND
  1012. mlm.operator_id_start <= megsa.region_id
  1013. AND
  1014. megsa.region_id < mlm.operator_id_end
  1015. )
  1016. JOIN
  1017. mz_introspection.mz_mappable_objects AS mo
  1018. ON (mlm.global_id = mo.global_id)
  1019. WHERE mo.name = 'materialize.public.v2_idx_x'
  1020. ORDER BY mlm.lir_id DESC;
  1021. EOF
  1022. query T multiline
  1023. EXPLAIN ANALYZE CPU, MEMORY WITH SKEW FOR INDEX v2_idx_x AS SQL;
  1024. ----
  1025. WITH
  1026. summary_cpu AS
  1027. (
  1028. SELECT
  1029. mlm.global_id AS global_id,
  1030. mlm.lir_id AS lir_id,
  1031. sum(mse.elapsed_ns) AS total_ns,
  1032. CASE
  1033. WHEN count(DISTINCT mse.worker_id) <> 0
  1034. THEN
  1035. sum(mse.elapsed_ns)
  1036. / count(DISTINCT mse.worker_id)
  1037. ELSE NULL
  1038. END
  1039. AS avg_ns
  1040. FROM
  1041. mz_introspection.mz_lir_mapping AS mlm
  1042. JOIN
  1043. mz_introspection.mz_scheduling_elapsed_per_worker AS mse
  1044. ON
  1045. (
  1046. mlm.operator_id_start <= mse.id
  1047. AND
  1048. mse.id < mlm.operator_id_end
  1049. )
  1050. GROUP BY mlm.global_id, mlm.lir_id
  1051. ),
  1052. per_worker_cpu AS
  1053. (
  1054. SELECT
  1055. mlm.global_id AS global_id,
  1056. mlm.lir_id AS lir_id,
  1057. mse.worker_id AS worker_id,
  1058. sum(mse.elapsed_ns) AS worker_ns
  1059. FROM
  1060. mz_introspection.mz_lir_mapping AS mlm
  1061. JOIN
  1062. mz_introspection.mz_scheduling_elapsed_per_worker AS mse
  1063. ON
  1064. (
  1065. mlm.operator_id_start <= mse.id
  1066. AND
  1067. mse.id < mlm.operator_id_end
  1068. )
  1069. GROUP BY mlm.global_id, mlm.lir_id, mse.worker_id
  1070. ),
  1071. summary_memory AS
  1072. (
  1073. SELECT
  1074. mlm.global_id AS global_id,
  1075. mlm.lir_id AS lir_id,
  1076. sum(mas.size) AS total_memory,
  1077. sum(mas.records) AS total_records,
  1078. CASE
  1079. WHEN count(DISTINCT mas.worker_id) <> 0
  1080. THEN sum(mas.size) / count(DISTINCT mas.worker_id)
  1081. ELSE NULL
  1082. END
  1083. AS avg_memory,
  1084. CASE
  1085. WHEN count(DISTINCT mas.worker_id) <> 0
  1086. THEN
  1087. sum(mas.records) / count(DISTINCT mas.worker_id)
  1088. ELSE NULL
  1089. END
  1090. AS avg_records
  1091. FROM
  1092. mz_introspection.mz_lir_mapping AS mlm
  1093. JOIN
  1094. mz_introspection.mz_arrangement_sizes_per_worker AS mas
  1095. ON
  1096. (
  1097. mlm.operator_id_start <= mas.operator_id
  1098. AND
  1099. mas.operator_id < mlm.operator_id_end
  1100. )
  1101. GROUP BY mlm.global_id, mlm.lir_id
  1102. ),
  1103. per_worker_memory AS
  1104. (
  1105. SELECT
  1106. mlm.global_id AS global_id,
  1107. mlm.lir_id AS lir_id,
  1108. mas.worker_id AS worker_id,
  1109. sum(mas.size) AS worker_memory,
  1110. sum(mas.records) AS worker_records
  1111. FROM
  1112. mz_introspection.mz_lir_mapping AS mlm
  1113. JOIN
  1114. mz_introspection.mz_arrangement_sizes_per_worker AS mas
  1115. ON
  1116. (
  1117. mlm.operator_id_start <= mas.operator_id
  1118. AND
  1119. mas.operator_id < mlm.operator_id_end
  1120. )
  1121. GROUP BY mlm.global_id, mlm.lir_id, mas.worker_id
  1122. )
  1123. SELECT
  1124. repeat(' ', nesting * 2) || operator AS operator,
  1125. pwc.worker_id AS worker_id,
  1126. CASE
  1127. WHEN pwc.worker_id IS NOT NULL AND sc.avg_ns <> 0
  1128. THEN round(pwc.worker_ns / sc.avg_ns, 2)
  1129. ELSE NULL
  1130. END
  1131. AS cpu_ratio,
  1132. pwc.worker_ns / 1000 * '1 microsecond'::interval AS worker_elapsed,
  1133. sc.avg_ns / 1000 * '1 microsecond'::interval AS avg_elapsed,
  1134. sc.total_ns / 1000 * '1 microsecond'::interval AS total_elapsed,
  1135. CASE
  1136. WHEN pwm.worker_id IS NOT NULL AND sm.avg_memory <> 0
  1137. THEN round(pwm.worker_memory / sm.avg_memory, 2)
  1138. ELSE NULL
  1139. END
  1140. AS memory_ratio,
  1141. pg_size_pretty(pwm.worker_memory) AS worker_memory,
  1142. pg_size_pretty(sm.avg_memory) AS avg_memory,
  1143. pg_size_pretty(sm.total_memory) AS total_memory,
  1144. CASE
  1145. WHEN pwm.worker_id IS NOT NULL AND sm.avg_records <> 0
  1146. THEN round(pwm.worker_records / sm.avg_records, 2)
  1147. ELSE NULL
  1148. END
  1149. AS records_ratio,
  1150. pwm.worker_records AS worker_records,
  1151. sm.avg_records AS avg_records,
  1152. sm.total_records AS total_records
  1153. FROM
  1154. mz_introspection.mz_lir_mapping AS mlm
  1155. LEFT JOIN summary_cpu AS sc USING(global_id, lir_id)
  1156. LEFT JOIN per_worker_cpu AS pwc USING(global_id, lir_id)
  1157. LEFT JOIN summary_memory AS sm USING(global_id, lir_id)
  1158. LEFT JOIN per_worker_memory AS pwm USING(global_id, lir_id)
  1159. JOIN
  1160. mz_introspection.mz_mappable_objects AS mo
  1161. ON (mlm.global_id = mo.global_id)
  1162. WHERE mo.name = 'materialize.public.v2_idx_x' AND pwm.worker_id = pwc.worker_id
  1163. ORDER BY mlm.lir_id DESC, worker_id;
  1164. EOF
  1165. # exhaustive "statement ok" checking
  1166. statement ok
  1167. EXPLAIN ANALYZE HINTS FOR MATERIALIZED VIEW w;
  1168. statement ok
  1169. EXPLAIN ANALYZE CPU FOR MATERIALIZED VIEW w;
  1170. statement ok
  1171. EXPLAIN ANALYZE CPU WITH SKEW FOR MATERIALIZED VIEW w;
  1172. statement ok
  1173. EXPLAIN ANALYZE MEMORY FOR MATERIALIZED VIEW w;
  1174. statement ok
  1175. EXPLAIN ANALYZE MEMORY WITH SKEW FOR MATERIALIZED VIEW w;
  1176. statement ok
  1177. EXPLAIN ANALYZE CPU, MEMORY FOR MATERIALIZED VIEW w;
  1178. statement ok
  1179. EXPLAIN ANALYZE MEMORY, CPU FOR MATERIALIZED VIEW w;
  1180. statement ok
  1181. EXPLAIN ANALYZE CPU, MEMORY WITH SKEW FOR MATERIALIZED VIEW w;
  1182. statement ok
  1183. EXPLAIN ANALYZE MEMORY, CPU WITH SKEW FOR MATERIALIZED VIEW w;
  1184. statement ok
  1185. EXPLAIN ANALYZE HINTS FOR INDEX v_idx_x;
  1186. statement ok
  1187. EXPLAIN ANALYZE CPU FOR INDEX v_idx_x;
  1188. statement ok
  1189. EXPLAIN ANALYZE CPU WITH SKEW FOR INDEX v_idx_x;
  1190. statement ok
  1191. EXPLAIN ANALYZE MEMORY FOR INDEX v_idx_x;
  1192. statement ok
  1193. EXPLAIN ANALYZE MEMORY WITH SKEW FOR INDEX v_idx_x;
  1194. statement ok
  1195. EXPLAIN ANALYZE CPU, MEMORY FOR INDEX v_idx_x;
  1196. statement ok
  1197. EXPLAIN ANALYZE MEMORY, CPU FOR INDEX v_idx_x;
  1198. statement ok
  1199. EXPLAIN ANALYZE CPU, MEMORY WITH SKEW FOR INDEX v_idx_x;
  1200. statement ok
  1201. EXPLAIN ANALYZE MEMORY, CPU WITH SKEW FOR INDEX v_idx_x;