如何在给定表格列表的情况下识别未使用/冗余的列?

时间:2009-01-07 15:27:15

标签: sql database

[这在iSeries / DB2数据库中,如果这有任何区别]

我想编写一个过程来识别留空或为零的列(给定一个表列表)。

假设我可以从中央系统表中提取表和列定义,我该如何检查上述条件?我的第一个猜测是每列生成一个动态语句,如:

select count(*) from my_table where my_column != 0

并检查这是否返回零行,但有更好/更快/标准的方法吗?

NB这只需要处理简单的字符,整数/小数字段,没什么特别的!

3 个答案:

答案 0 :(得分:3)

是的,通常,我会在SQL Server中执行类似的操作:

SELECT
REPLACE(REPLACE(REPLACE(
'
    SELECT COUNT(*) AS [COUNT NON-EMPTY IN {TABLE_NAME}.{COLUMN_NAME}]
    FROM [{TABLE_SCHEMA}].[{TABLE_NAME}]
    WHERE [{COLUMN_NAME}] IS NOT NULL
        OR [{COLUMN_NAME}] <> 0
'
, '{TABLE_SCHEMA}', c.TABLE_SCHEMA)
, '{TABLE_NAME}', c.TABLE_NAME)
, '{COLUMN_NAME}', c.COLUMN_NAME) AS [SQL]
FROM INFORMATION_SCHEMA.COLUMNS c
INNER JOIN INFORMATION_SCHEMA.TABLES t
    ON t.TABLE_TYPE = 'BASE TABLE'
    AND c.TABLE_CATALOG = t.TABLE_CATALOG
    AND c.TABLE_SCHEMA = t.TABLE_SCHEMA
    AND c.TABLE_NAME = t.TABLE_NAME
    AND c.DATA_TYPE = 'int'

通过执行整个查询的UNION并检查每列上的IS_NULLABLE,您可以获得更多的动力,显然您可能对不同的数据类型有不同的要求,并且跳过标识列等。

答案 1 :(得分:3)

检查DB2上仅包含NULL的列:

  1. 在您的数据库(http://www.ibm.com/developerworks/data/library/techarticle/dm-0412pay/
  2. 上执行RUNSTATS
  3. 通过查询SYSSTAT.TABLES和SYSSTAT.COLUMNS来检查数据库统计信息。比较SYSSTAT.TABLES.CARD和SYSSTAT.COLUMNS.NUMNULLS将告诉您需要什么。 一个例子可能是:
  4. 
     select t.tabschema, t.tabname, c.colname 
     from sysstat.tables t, sysstat.columns c 
     where ((t.tabschema = 'MYSCHEMA1' and t.tabname='MYTABLE1') or 
            (t.tabschema = 'MYSCHEMA2' and t.tabname='MYTABLE2') or 
            (...)) and 
          t.tabschema = c.tabschema and t.tabname = c.tabname and
          t.card = c.numnulls
    

    有关系统统计信息的详情,例如在这里:http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r0001070.htmhttp://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r0001073.htm

    同样,您可以使用SYSSTAT.COLUMNS.AVGCOLLEN检查空列(只是它似乎不适用于LOB)。

    编辑:并且,要检查仅包含零的列,请尝试在SYSSTAT.COLUMNS中比较HIGH2KEY和LOW2KEY。

答案 2 :(得分:0)

我假设你想要知道给定列的所有行中是否有任何值。如果你的列可能有“空白”,你可能需要在WHERE子句中添加一个OR NOT NULL来获得正确的答案。