FAST(<0.1 s)
SELECT 1
FROM sample
JOIN unit ON sample.unit_key = unit.key
WHERE sample.sample_id = 'http://example.com/foo';
+-JOIN HASH [Cost: 2K, Rows: 37] (PATH ID: 1)
| Join Cond: (sample.UNIT_KEY = unit.KEY)
| +-- Outer -> STORAGE ACCESS for unit [Cost: 987, Rows: 3M] (PATH ID: 2)
| | Projection: OLAPTEST_PRIVATE.UNIT_super
| | Materialize: unit.KEY
| | Runtime Filter: (SIP1(HashJoin): unit.KEY)
| +-- Inner -> STORAGE ACCESS for sample [Cost: 92, Rows: 37] (PATH ID: 3)
| | Projection: OLAPTEST_PRIVATE.SAMPLE_super
| | Materialize: sample.UNIT_KEY
| | Filter: (sample.SAMPLE_ID = 'http://example.com/foo')
SLOW(> 2s)
SELECT 1
FROM sample
JOIN unit ON sample.unit_key = unit.key
WHERE sample.sample_id = 'foo';
+-JOIN HASH [Cost: 5K, Rows: 1 (PREDICATE VALUE OUT-OF-RANGE)] (PATH ID: 1)
| Join Cond: (sample.UNIT_KEY = unit.KEY)
| +-- Outer -> STORAGE ACCESS for sample [Cost: 90, Rows: 1 (PREDICATE VALUE OUT-OF-RANGE)] (PATH ID: 2)
| | Projection: OLAPTEST_PRIVATE.SAMPLE_super
| | Materialize: sample.UNIT_KEY
| | Filter: (sample.SAMPLE_ID = 'foo')
| | Runtime Filter: (SIP1(HashJoin): sample.UNIT_KEY)
| +-- Inner -> STORAGE ACCESS for unit [Cost: 987, Rows: 3M] (PATH ID: 3)
| | Projection: OLAPTEST_PRIVATE.UNIT_super
| | Materialize: unit.KEY
没有联接,查询很快。
sample_id
列中的所有值均以'http://example.com/ ..']开头>
我已经分析了所有表的统计信息。
SAMPLE_ID VARCHAR(1000) NOT NULL (AUTO encoding)
。没有UNIQUE约束,外键等。sample_id
列会导致对它不存在的值进行如此缓慢的筛选会导致什么?按表的其他列(具有更多变化的值,但很少有不同的值)进行过滤的效果都很好。
对另一个表(例如单元)进行查询,该表也具有其值为http-uris的列,不会产生类似的性能效果。
我该怎么办?如果用户提供的值不存在,我不希望应用程序变慢...
我们仍处于Vertica 7,希望尽快更新到具有较新版本的新群集(那时我们也可以为表格创建更好的投影)。
快速(<0.1 s)从样本JOIN中选择1单元ON sample.unit_key = unit.key WHERE sample.sample_id ='http://example.com/foo'; + -JOIN HASH [费用:2K,行:37](路径ID:1)|加入条件:(...
由于SAMPLE
表太小,因此应为UNSEGMENTED
。用未分段的分段投影代替分段的超投影-无论如何,这对于这样的小桌子来说都是最佳实践。此外,将SAMPLE
表设为UNSEGMENTED
将消除联接期间的全局重新分段。