分享

如何在PowerDesigner里面去掉统计信息

 WindySky 2008-08-25

最新使用PowerDesigner对SQL Server 2000数据库作反向工程、以比较数据库和PDM的差异的时候,经常

会从数据库中Reverse出来一些名称以“_WA_Sys”开头的索引,这些索引并不是我们做数据库设计的时候

加的,而且从企业管理器中也看不到这些索引。
但是,使用“select * from sysindexes where name like '_WA_Sys%'”语句,直接查询sysindexes系

统表却能够查询出来。
后经查询相关技术文档得知,名称以“_WA_Sys”开头的索引,其实并不是真正的索引、也不具备索引的

功能,它是SQL Server查询优化器自动创建的统计信息(statistics)。
可是我们在PowerDesigner里面并不需要这些统计信息,如何才能使PD在Reverse的时候过滤掉这些统计呢


在PowerDesigner里面依次点击Tools-Resources-DBMS,打开“List of DBMS”窗口,从中选择Microsoft

SQL Server 2000,再点击窗口上方的第一个按钮“Property”,现在我们来编辑PD的Reverse行为——
从左侧的TreeView中依次展开Script\Objects\Index,点击SqlListQuery,在右面的Value大编辑框里我

们可以看到如下SQL语句:
{OWNER ID, TABLE ID, INDEX ID, CLUSTER ID, UNIQUE ID, CIDXLIST ...}

select
   u.name,
   o.name,
   i.name,
   case(i.status & 16) when 16 then 'clustered' else '' end,
   case(i.status &  2) when  2 then 'unique'    else '' end,
   case(k.keyno) when 1 then '' else ', ' end + c.name + case (Indexkey_Property(k.id,

k.indid, k.keyno, 'IsDescending')) when 1 then ' desc' else ' asc' end
from
   sysusers u
      join sysobjects o on (o.uid = u.uid)
      join sysindexes i on (i.id = o.id)
      join sysindexkeys k on (k.id = i.id and k.indid = i.indid)
      join syscolumns c on (c.id = k.id and c.colid = k.colid)
where i.indid between 1 and 254
[  and o.name = %.q:TABLE%]
[  and u.name = %.q:SCHEMA%]
order by
   1, 2, 3, k.keyno

好的,看到了吗?在where i.indid between 1 and 254的下方加一句:

   and i.name not like '%_WA_Sys%' --过滤掉SQL Server自动创建的统计信息

就OK了。

加完之后就是现在这个样子:
{OWNER ID, TABLE ID, INDEX ID, CLUSTER ID, UNIQUE ID, CIDXLIST ...}

select
   u.name,
   o.name,
   i.name,
   case(i.status & 16) when 16 then 'clustered' else '' end,
   case(i.status &  2) when  2 then 'unique'    else '' end,
   case(k.keyno) when 1 then '' else ', ' end + c.name + case (Indexkey_Property(k.id,

k.indid, k.keyno, 'IsDescending')) when 1 then ' desc' else ' asc' end
from
   sysusers u
      join sysobjects o on (o.uid = u.uid)
      join sysindexes i on (i.id = o.id)
      join sysindexkeys k on (k.id = i.id and k.indid = i.indid)
      join syscolumns c on (c.id = k.id and c.colid = k.colid)
where i.indid between 1 and 254
   and i.name not like '%_WA_Sys%' --过滤掉SQL Server自动创建的统计信息
[  and o.name = %.q:TABLE%]
[  and u.name = %.q:SCHEMA%]
order by
   1, 2, 3, k.keyno

好了,保存并关掉所有窗口,重新试试PD的Reverse,索引列表中是不是没有那些统计信息了?
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多