按不存在的列/非典型值进行过滤会导致性能降低

问题描述 投票:0回答:1

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
  • 通过'foo'过滤(列中不存在值)->缓慢
  • 过滤依据'xhttp://example.com / ...'(列中不存在值)->慢
  • 过滤器通过“ http://example.com/foo”(列中不存在值)->快速
  • 按'http://example.com/123'(列中的现有值)->快速过滤

没有联接,查询很快。

sample_id列中的所有值均以'http://example.com/ ..']开头>

我已经分析了所有表的统计信息。

  • SAMPLE_ID VARCHAR(1000) NOT NULL (AUTO encoding)。没有UNIQUE约束,外键等。
  • 样本= 1万行
  • UNIT = 30M +行
  • 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)|加入条件:(...

vertica
1个回答
0
投票

由于SAMPLE表太小,因此应为UNSEGMENTED。用未分段的分段投影代替分段的超投影-无论如何,这对于这样的小桌子来说都是最佳实践。此外,将SAMPLE表设为UNSEGMENTED将消除联接期间的全局重新分段。

© www.soinside.com 2019 - 2024. All rights reserved.