【问题标题】:Find all uncompressed tables in Teradata查找 Teradata 中的所有未压缩表
【发布时间】:2017-02-27 09:20:29
【问题描述】:

有没有办法在 teradata 中找到所有未压缩的表?

到目前为止,我是使用手动完成的

SHOW TABLE <TABLE_NAME>

并检查列是否有 COMPRESS 关键字。如果我有 100 张桌子,这会变得很乏味。

是否有可以查询此类表的列或表,例如我可以检查宏 -

SELECT * FROM dbc.tables WHERE tablekind='M' AND databasename='database'

感谢任何帮助。

【问题讨论】:

    标签: sql database compression teradata


    【解决方案1】:

    你可以找到所有压缩的列:

    select * from dbc.ColumnsV 
    where CompressValueList is not null
    

    要获得没有任何压缩的表格:

    SELECT * FROM dbc.TablesV
    WHERE TableKind IN ('T', 'O') -- both PI and NoPI tables
    AND (DatabaseName, TableName) NOT IN 
     (
       SELECT DatabaseName, TableName 
       FROM dbc.columnsv
       WHERE CompressValueList IS NOT NULL
     )
    

    【讨论】:

    • dbc.TablesVdbc.Tables 之间有区别吗?
    • @PirateX:当然,所有非 V 视图都是自 TD12 以来的遗留物,不应再使用。当您使用 TD14.10+ 并使用超过 30 个字符的对象名称时,dbc.Tables 将截断它们。
    【解决方案2】:

    您可以为此使用 dbc 表列。 Compressible = 'C' 会给你这些值。

    select databasename,tablename,columnname,compressible
    from dbc.columns
    where compressible in ('A','C')
    

    顺便说一下,在我们的查询中为什么选择 tablekind='M',它不会返回表的详细信息,但会返回宏的详细信息。

    【讨论】:

    • 你应该切换到where compressible in ('A','C'),否则你会忽略算法压缩的列。
    【解决方案3】:

    正如您所提到的,压缩更多的是“列”而不是“表”,因此您最好检查列元数据:

    这是一个可能的查询(有待改进):

      select  t.tablename, sum(case when compressvaluelist is null then 0 else 1 end) compressed_cols, count(*) cols  
        from dbc.ColumnsV c join dbc.TablesV t on (c.tablename=t.tablename and c.databasename=t.databasename) 
       where t.databasename='<databasename>'
         and t.tablekind in ('T','O')
       group by 1    
      having compressed_cols=0
    

    【讨论】:

    • 这将返回所有的 Macros/SPs/Views 等,你需要加入 dbc.TablesV 以获得 TableKind 'T'。
    • @dnoeth 好的,谢谢.. 我还为 nopi 表添加了 tablekind 'O'。
    • 谢谢,我也忘记了:)
    猜你喜欢
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    相关资源
    最近更新 更多