如何基于多表创建Vertica投影?解决投影仅能从单表选取数据的报错问题
解决Vertica投影创建报错:Projections must select data from only one table
这个错误的根源是对Vertica投影(Projection)的定位理解有误——Vertica的投影是专门针对单个表的物理存储优化结构,它的作用是预存储单表的特定列、排序或分段数据来加速查询,完全不支持基于多表关联(JOIN)的结果创建。
针对你的需求,分两种场景给出解决方案:
场景1:只是想优化这个JOIN查询的性能
不用创建关联结果的投影,而是分别为两张表创建包含关联键和查询所需列的单表投影,让Vertica能高效执行关联:
为test_employee创建投影
CREATE PROJECTION public.test_employee_proj ( index, id_dep, name, date_of_birth, address ) AS SELECT index, id_dep, name, date_of_birth, address FROM public.test_employee ORDER BY id_dep, name SEGMENTED BY HASH(id_dep) ALL NODES;
为test_department创建投影
CREATE PROJECTION store.test_department_proj ( index, name, describe ) AS SELECT index, name, describe FROM store.test_department ORDER BY index UNSEGMENTED ALL NODES;
这两个投影会把你查询需要的列和关联用到的id_dep/index提前按合适的规则存储,Vertica在执行你的JOIN查询时,会自动选用这些投影来加速,不用扫描全表。
场景2:需要持久化存储JOIN后的结果
如果确实要把关联后的结果物理存储下来(类似其他数据库的物化视图),你需要用Vertica的物化视图(Materialized View),这才是用来存储复杂查询(包括多表关联)结果的对象:
CREATE MATERIALIZED VIEW public.employee_department_mv AS SELECT e.index AS idEmp, e.id_dep AS idDep, e.name AS empName, e.date_of_birth, e.address, d.name AS depName, d.describe FROM public.test_employee e INNER JOIN store.test_department d ON e.id_dep = d.index ORDER BY e.name;
创建完成后,你可以像查询普通表一样查询这个物化视图:
SELECT * FROM public.employee_department_mv;
默认情况下Vertica的物化视图是手动刷新的,你可以根据业务需求配置自动刷新策略,确保数据和源表同步。
内容的提问来源于stack exchange,提问作者Sang Nguyễn
相关产品推荐
相关产品推荐

