【问题标题】:How to check if a projection exists before dropping it in Vertica?如何在将投影放入 Vertica 之前检查它是否存在?
【发布时间】:2016-01-28 19:17:46
【问题描述】:

我想做类似的事情

DROP PROJECTION IF EXISTS myProjection;

显然我可以将 IF EXISTS 用于表格,但不能用于投影。

我知道如果我使用 CASCADE 删除表格,那应该会删除相应的投影,但我显然有一些我没有跟踪的孤立投影。有时当我重命名表/投影时,它会说投影已经存在。

The Drop Projection pagethis stackoverflow page for generic sql 没有多大帮助。

编辑:我在 Mybatis Migrations 中使用它。因此,如果任何脚本中有错误,我的整个迁移都会失败。所以,不,我不能忽略这个错误。

如果没有 IF EXISTS 的投影 - 是否有一种编程方式(如 TSQL/PLSQL),我可以指定一个条件来检查投影是否存在并采取操作是否删除它?

【问题讨论】:

  • 您可以检查系统视图projections 是否存在投影
  • 如果投影不存在,@Hogan GET_PROJECTION_STATUS 会抛出错误。我刚刚确认了我的运行:SELECT GET_PROJECTION_STATUS('myProjection');
  • @a_horse_with_no_name 考虑到 vertica 中没有 If 语句,我不确定如何准确地构建脚本。我尝试使用case statement,但似乎不是可行的方法。
  • 你能提供更多关于你的过程的细节吗?为什么不直接发出DROP 并忽略错误?

标签: sql ddl vertica


【解决方案1】:

没有drop projection IF EXISTS ...。您可以只使用 drop projection ... 并且 - 当然 - 如果您尝试删除的投影不存在,您会收到一条错误消息。

您可以使用如下 SQL 列出给定架构/表的所有投影:

\set schema '''my_schema'''
\set table '''my_table'''
select
    projection_name,
    sum(row_count) as row_count, 
    sum(used_bytes) as used_bytes,
    sum(wos_row_count) as wos_row_count, 
    sum(wos_used_bytes) as wos_used_bytes, 
    sum(ros_row_count) as ros_row_count, 
    sum(ros_used_bytes) as ros_used_bytes
from
    projection_storage 
where 
    anchor_table_schema = :schema and
    anchor_table_name = :table
group by 1
order by 1
;

以下将列出与给定架构中的表关联的所有投影:

\set schema '''my_schema'''
select
    projection_name,
    anchor_table_name,
    sum(row_count) as row_count, 
    sum(used_bytes) as used_bytes,
    sum(wos_row_count) as wos_row_count, 
    sum(wos_used_bytes) as wos_used_bytes, 
    sum(ros_row_count) as ros_row_count, 
    sum(ros_used_bytes) as ros_used_bytes
from
    projection_storage 
where 
    anchor_table_schema = :schema
group by 1, 2
order by 1, 2
;

【讨论】:

    【解决方案2】:

    您可以在 vertica 中查询目录表,这将为您提供所有当前模式的模式名称,

    select v_catalog.columns from v_catalog.columns; 
    

    我有时会使用这个选择查询,它会为我提供与表格相关的所有信息

    select export_objects('','your_schema.table_name');
    

    【讨论】:

      【解决方案3】:

      从 Vertica 9.2.x 开始,这是可能的。

      DROP PROJECTION IF EXISTS myProjection;
      

      参考:https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/SQLReferenceManual/Statements/DROPPROJECTION.htm

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-15
        • 2011-01-05
        • 2012-12-04
        • 2017-06-08
        • 1970-01-01
        • 2015-12-17
        相关资源
        最近更新 更多