2022-01-24 12:31:24 +00:00
|
|
|
-- TEST CACHE
|
|
|
|
CREATE TABLE t1 (i Int64, j Int64) ENGINE = Memory;
|
|
|
|
INSERT INTO t1 SELECT number, number FROM system.numbers LIMIT 100;
|
|
|
|
CREATE TABLE t2 (k Int64, l Int64, m Int64, n Int64) ENGINE = Memory;
|
|
|
|
|
|
|
|
CREATE MATERIALIZED VIEW mv1 TO t2 AS
|
|
|
|
WITH
|
|
|
|
(SELECT max(i) FROM t1) AS t1
|
|
|
|
SELECT
|
|
|
|
t1 as k, -- Using local cache x 4
|
|
|
|
t1 as l,
|
|
|
|
t1 as m,
|
|
|
|
t1 as n
|
|
|
|
FROM t1
|
|
|
|
LIMIT 5;
|
|
|
|
|
|
|
|
-- FIRST INSERT
|
|
|
|
INSERT INTO t1
|
|
|
|
WITH
|
|
|
|
(SELECT max(i) FROM t1) AS t1
|
|
|
|
SELECT
|
|
|
|
number as i,
|
|
|
|
t1 + t1 + t1 AS j -- Using global cache
|
|
|
|
FROM system.numbers
|
|
|
|
LIMIT 100
|
|
|
|
SETTINGS
|
|
|
|
min_insert_block_size_rows=5,
|
|
|
|
max_insert_block_size=5,
|
|
|
|
min_insert_block_size_rows_for_materialized_views=5,
|
|
|
|
max_block_size=5,
|
|
|
|
max_threads=1;
|
|
|
|
|
|
|
|
SELECT k, l, m, n, count()
|
|
|
|
FROM t2
|
|
|
|
GROUP BY k, l, m, n
|
|
|
|
ORDER BY k, l, m, n;
|
|
|
|
|
|
|
|
SYSTEM FLUSH LOGS;
|
|
|
|
-- The main query should have a cache miss and 3 global hits
|
|
|
|
-- The MV is executed 20 times (100 / 5) and each run does 1 miss and 4 hits to the LOCAL cache
|
|
|
|
-- In addition to this, to prepare the MV, there is an extra preparation to get the list of columns via
|
|
|
|
-- InterpreterSelectQuery, which adds 1 miss and 4 global hits (since it uses the global cache)
|
|
|
|
-- So in total we have:
|
|
|
|
-- Main query: 1 miss, 3 global
|
|
|
|
-- Preparation: 1 miss, 4 global
|
|
|
|
-- Blocks (20): 20 miss, 0 global, 80 local hits
|
|
|
|
|
|
|
|
-- TOTAL: 22 miss, 7 global, 80 local
|
|
|
|
SELECT
|
|
|
|
'02177_MV',
|
|
|
|
ProfileEvents['ScalarSubqueriesGlobalCacheHit'] as scalar_cache_global_hit,
|
|
|
|
ProfileEvents['ScalarSubqueriesLocalCacheHit'] as scalar_cache_local_hit,
|
|
|
|
ProfileEvents['ScalarSubqueriesCacheMiss'] as scalar_cache_miss
|
|
|
|
FROM system.query_log
|
|
|
|
WHERE
|
|
|
|
current_database = currentDatabase()
|
|
|
|
AND type = 'QueryFinish'
|
|
|
|
AND query LIKE '-- FIRST INSERT\nINSERT INTO t1\n%'
|
|
|
|
AND event_date >= yesterday() AND event_time > now() - interval 10 minute;
|
|
|
|
|
2022-01-24 16:28:32 +00:00
|
|
|
DROP TABLE mv1;
|
2022-01-24 12:31:24 +00:00
|
|
|
|
2022-01-24 16:28:32 +00:00
|
|
|
CREATE TABLE t3 (z Int64) ENGINE = Memory;
|
|
|
|
CREATE MATERIALIZED VIEW mv2 TO t3 AS
|
|
|
|
SELECT
|
|
|
|
-- This includes an unnecessarily complex query to verify that the local cache is used (since it uses t1)
|
|
|
|
sum(i) + sum(j) + (SELECT * FROM (SELECT min(i) + min(j) FROM (SELECT * FROM system.one _a, t1 _b))) AS z
|
|
|
|
FROM t1;
|
|
|
|
|
|
|
|
-- SECOND INSERT
|
|
|
|
INSERT INTO t1
|
|
|
|
SELECT 0 as i, number as j from numbers(100)
|
|
|
|
SETTINGS
|
|
|
|
min_insert_block_size_rows=5,
|
|
|
|
max_insert_block_size=5,
|
|
|
|
min_insert_block_size_rows_for_materialized_views=5,
|
|
|
|
max_block_size=5,
|
|
|
|
max_threads=1;
|
|
|
|
|
|
|
|
SELECT * FROM t3 ORDER BY z ASC;
|
|
|
|
SYSTEM FLUSH LOGS;
|
|
|
|
SELECT
|
|
|
|
'02177_MV_2',
|
|
|
|
ProfileEvents['ScalarSubqueriesGlobalCacheHit'] as scalar_cache_global_hit,
|
|
|
|
ProfileEvents['ScalarSubqueriesLocalCacheHit'] as scalar_cache_local_hit,
|
|
|
|
ProfileEvents['ScalarSubqueriesCacheMiss'] as scalar_cache_miss
|
|
|
|
FROM system.query_log
|
|
|
|
WHERE
|
|
|
|
current_database = currentDatabase()
|
|
|
|
AND type = 'QueryFinish'
|
|
|
|
AND query LIKE '-- SECOND INSERT\nINSERT INTO t1%'
|
|
|
|
AND event_date >= yesterday() AND event_time > now() - interval 10 minute;
|
|
|
|
|
|
|
|
DROP TABLE mv2;
|
2022-01-24 12:31:24 +00:00
|
|
|
|
|
|
|
|
2022-01-24 16:28:32 +00:00
|
|
|
CREATE TABLE t4 (z Int64) ENGINE = Memory;
|
|
|
|
CREATE MATERIALIZED VIEW mv3 TO t4 AS
|
|
|
|
SELECT
|
|
|
|
-- This includes an unnecessarily complex query but now it uses t2 so it can be cached
|
|
|
|
min(i) + min(j) + (SELECT * FROM (SELECT min(k) + min(l) FROM (SELECT * FROM system.one _a, t2 _b))) AS z
|
|
|
|
FROM t1;
|
|
|
|
|
|
|
|
-- THIRD INSERT
|
|
|
|
INSERT INTO t1
|
|
|
|
SELECT number as i, number as j from numbers(100)
|
|
|
|
SETTINGS
|
|
|
|
min_insert_block_size_rows=5,
|
|
|
|
max_insert_block_size=5,
|
|
|
|
min_insert_block_size_rows_for_materialized_views=5,
|
|
|
|
max_block_size=5,
|
|
|
|
max_threads=1;
|
|
|
|
SYSTEM FLUSH LOGS;
|
|
|
|
|
|
|
|
SELECT * FROM t4 ORDER BY z ASC;
|
|
|
|
|
|
|
|
SELECT
|
|
|
|
'02177_MV_3',
|
|
|
|
ProfileEvents['ScalarSubqueriesGlobalCacheHit'] as scalar_cache_global_hit,
|
|
|
|
ProfileEvents['ScalarSubqueriesLocalCacheHit'] as scalar_cache_local_hit,
|
|
|
|
ProfileEvents['ScalarSubqueriesCacheMiss'] as scalar_cache_miss
|
|
|
|
FROM system.query_log
|
|
|
|
WHERE
|
|
|
|
current_database = currentDatabase()
|
|
|
|
AND type = 'QueryFinish'
|
|
|
|
AND query LIKE '-- THIRD INSERT\nINSERT INTO t1%'
|
|
|
|
AND event_date >= yesterday() AND event_time > now() - interval 10 minute;
|
2022-01-24 12:31:24 +00:00
|
|
|
|
2022-01-24 16:28:32 +00:00
|
|
|
DROP TABLE mv3;
|
|
|
|
DROP TABLE t1;
|
|
|
|
DROP TABLE t2;
|
|
|
|
DROP TABLE t3;
|
|
|
|
DROP TABLE t4;
|