Skip to content

Constraint optimization requires to have WHERE clause in query. #33544

@UnamedRus

Description

@UnamedRus

How to reproduce
ClickHouse 21.13.1.852

CREATE TABLE default.test_constr
(
    `key` UInt32,
    `map` Map(String, String),
    `key_a` String DEFAULT map['key_a'],
    CONSTRAINT key_a_constr ASSUME key_a = (map['key_a']),
    CONSTRAINT key_a_constr ASSUME (map['key_a']) = key_a
)
ENGINE = MergeTree
ORDER BY key
SETTINGS index_granularity = 8192;

set optimize_using_constraints =1, optimize_substitute_columns = 1, convert_query_to_cnf =1, optimize_append_index=1;

INSERT INTO test_constr(key, map) SELECT number, map('key_a','lala', 'key_b','lalalalalalalalalalalalala','key_c', 'lalalalalalalalalala') FROM numbers(1000000);

SELECT count(map['key_a'])
FROM test_constr

┌─count(arrayElement(map, 'key_a'))─┐
│                           1000000 │
└───────────────────────────────────┘

1 rows in set. Elapsed: 0.064 sec. Processed 1.00 million rows, 127.00 MB (15.55 million rows/s., 1.97 GB/s.)

SELECT count(key_a)
FROM test_constr

┌─count(key_a)─┐
│      1000000 │
└──────────────┘

1 rows in set. Elapsed: 0.008 sec. Processed 1.00 million rows, 13.00 MB (120.52 million rows/s., 1.57 GB/s.)

SELECT count()
FROM test_constr
WHERE NOT ignore(map['key_a'])

┌─count()─┐
│ 1000000 │
└─────────┘

1 rows in set. Elapsed: 0.009 sec. Processed 1.00 million rows, 13.00 MB (110.58 million rows/s., 1.44 GB/s.)

SELECT count()
FROM test_constr
WHERE NOT ignore(key_a)

┌─count()─┐
│ 1000000 │
└─────────┘

1 rows in set. Elapsed: 0.015 sec. Processed 1.00 million rows, 13.00 MB (67.03 million rows/s., 871.37 MB/s.)

SELECT count(x)
FROM test_constr
WHERE NOT ignore(map['key_a'] AS x)

┌─count(arrayElement(map, 'key_a'))─┐
│                           1000000 │
└───────────────────────────────────┘

1 rows in set. Elapsed: 0.010 sec. Processed 1.00 million rows, 13.00 MB (96.81 million rows/s., 1.26 GB/s.)

EXPLAIN SYNTAX
SELECT count(x)
FROM test_constr
WHERE NOT ignore(map['key_a'] AS x)

┌─explain─────────────────────────────────────────────────────────┐
│ SELECT count(key_a AS x) AS `count(arrayElement(map, 'key_a'))` │
│ FROM test_constr                                                │
│ WHERE NOT ignore(key_a)                                         │
└─────────────────────────────────────────────────────────────────┘

Expected behavior
All queries will be optimized by CONSTRAINT optimization

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions