免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3736 | 回复: 2
打印 上一主题 下一主题

批量升级ASE中索引的方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-19 14:47 |只看该作者 |倒序浏览
通过Dump/Load跨操作系统平台数据库迁移或升级后,经常需要重建所有库的索引。否则,访问数据库对象是,经常会提示类似于下面的错误:
  1. Index id 2 on table id 652529358 cannot be used in the optimization of a query as it is SUSPECT. Please have the SA run DBCC REINDEX on the specified table.
复制代码


导致客户应用无法正常运行。

我整理了一个步骤,可以很方便的重建所有Load以后的数据库中的索引,彻底解决这一问题。
假设要Load的库都以“DB”开头,这些语句可以用以下方法生成。

1. 执行下面的sql


  1. /* 重建所有业务库中表的索引 */
  2. select " select 'use "  + name + "' + char(13) + char(10) + 'go' + char(13) + char(10) + " +
  3.         "        'dbcc reindex(' + name + ')' + char(13) + char(10) + 'go'  "  +
  4.         " from " + name + "..sysobjects " +
  5.         " where type='U' "
  6. from master..sysdatabases
  7. where name like 'DB%'    /* 这里的条件可以自己根据实际情况而定 */
  8. go
复制代码


将生成类似下面的SQL:


  1. select 'use DB_Test' + char(13) + char(10) +
  2.        'go' + char(13) + char(10) +
  3.        'dbcc reindex(' + name + ')' + char(13) + char(10) + 'go'  
  4.    from DB_Test..sysobjects  where type='U'
  5. ...
复制代码


2. 再执行上面生成的这些sql,即可生成最终的重建索引的sql:

  1. use DB_Test
  2. go
  3. dbcc reindex(MyTable)
  4. go
  5. ...
复制代码

[ 本帖最后由 aliking 于 2007-7-19 16:40 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-07-20 09:39 |只看该作者
呵呵,这里为什么不用cursor 加上动态sql而是生成可执行的sql!思想和这个是一模一样的

论坛徽章:
0
3 [报告]
发表于 2007-07-20 13:57 |只看该作者

回复 #2 chenfeng825 的帖子

用cursor也可以,如果不考虑对系统表锁定的时间的话。
在公司内部用这样的脚本作例子,是为了给新人介绍用SQL生成SQL的方法,抛砖引玉。
另外,也是出于脚本通用性的考虑。我们有相当一部分用户用得还是ASE11.92,不支持动态SQL。
不过,对我来说,最重要的是这样写能使脚本最简单,一句话就搞定:不用声明、打开、关闭、释放游标,也不用封装在一个存储过程里:)

[ 本帖最后由 aliking 于 2007-7-20 14:14 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP