SybaseASE系统表的应用

本文介绍如何使用Sybase ASE系统表和系统函数来批量检查和管理数据库中的索引,包括创建存储过程来收集索引信息,并通过查询找出未建立索引的字段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SybaseASE系统表的应用

一、 问题背景

在排查江西、湖南地区数字XX系统数据库CPU高和慢SQL问题时,发现系统中有很多简单的全表扫描SQL,原因是一些子表外键没有索引导致。

添加缺失外健索引成为当务之急。数字法院系统有几十个SMD文档,2000多张表,上万个字段,人工检查SMD文档工作量大,效率低。而sybase的sp_help、sp_helpindex又只能查看单个表的索引情况,没有办法检查整个数据库的索引情况。

 

二、 解决思路

查阅sp_help和sp_helpindex的源代码发现,可以通过ase的系统表、系统函数来获取到整个数据的建立索引情况,然后通过系统表关联得出没有建立外健索引的字段。

    用到的系统表有:

1. sysobjects

系统对象表,每个表、视图、存储过程、触发器等数据库对象都在sysobjects中有一行。

主要字段如下:

列名

字段类型

描述

name

varchar(255)

对象名

id

int

对象ID

type

char(2)

对象类型,U:用户表、V:系统表、V:视图

 

2. syscolumns

系统列表,每个表、视图中的每一列和过程的每个参数在syscolumns中都有对应的一行。

主要字段如下:

列名

字段类型

描述

id

int 

所属表或者过程的id

colid

smallint

列id

name

varchar(255)

列名

type

tinyint

存储类型

length

int

物理长度

 

3. sysindexes

系统索引表,每个聚簇索引、非聚簇索引、没有聚簇索引的表、包含text\image列的表都在sysindexes中有对应的一行。注意:该表中没有索引的key信息,即索引建立在表的哪些字段上。

主要字段如下:

列名

字段类型

描述

id

int

所属表ID或索引ID

indid

smallint

表内索引id,0:表、1:页锁表聚簇索引、>1:DOL锁表索引、255:text\image\log。表内索引id的范围是1~254,一张表最多能建立254个索引。

keycnt

smallint

键的个数。取值范围是1~31,复合索引最多能包含31个列。

name

varchar(255)

表名或索引

status

smallint

内部系统状态信息

status2

smallint

内部系统状态信息

status3

smallint

内部系统状态信息

 

4. spt_values

系统内部值表,相当于业务系统中的“单值代码”表。根据type、number 字段 查出其他表中status 对应的name。

主要字段如下:

列名

字段类型

描述

name

varchar(255)

系统内部状态值对应名称

type

char

系统内部状态类型

number

int

系统内部状态值

 

   系统函数有:

1. index_col(obj_name,index_id,key_# [,user_id])

返回表、视图中索引的列名。

参数名

描述

object_name

表名或者视图名

index_id

表sysindex中indid的值

key_#

键值顺序。如sysindex中keycnt为3,说明该索引包含3个列,key_#需要依次传入1、2、3,依次获得第一列、第二列、第三列名称

user_id

object_name的所有者id,可选

 

2. index_colorder(obj_name,index_id,key_# [,userid])

返回索引中列的desc/asc顺序。

参数名

描述

object_name

表名或者视图名

index_id

表sysindex中indid的值

key_#

键值顺序。如sysindex中keycnt为3,说明该索引包含3个列,key_#需要依次传入1、2、3,依次获得第一列、第二列、第三列名称

user_id

object_name的所有者id,可选

三、 解决步骤

第一步:创建表T_SYS_TABLE_INDEX 用于存储库中所有表的索引情况,主要字段如下:

列名

类型

描述

table_name

varchar(255)

表名

table_id

int

表id

index_name

varchar(255)

索引名称

index_keys

varchar(1024)

索引列

index_descriptions

varchar(68)

索引描述

index_created

datetime

索引创建时间

 

 

第二步: 创建sp_genIndexInfo存储过程,收集单个表的索引信息。

  主要过程为:

1. 循环获取表的所有索引id

select @indid = min(indid) from sysindexes where id = object_id(@objname) and indid > 0 and indid < 255

 

while @indid is not NULL

begin

    ----------------------------

    --获取单个索引的索引键值逻辑

    ----------------------------

    select @lastindid = @indid

    select @indid = NULL

    select @indid = min(indid) from sysindexes where id = object_id(@objname) and indid > @lastindid and indid < 255

END

 

2. 获取单个索引的索引键值逻辑

while @i <= 31

    begin

        select @thiskey = index_col(@objname, @indid, @i)

        if (@thiskey is NULL) 

        begin

            goto keysdone

        end

        if @i > 1

        begin

            select @keys = @keys + ", " 

        end

        select @keys = @keys + @thiskey

        select @sorder = index_colorder(@objname, @indid, @i)

        if (@sorder = "DESC")

            select @keys = @keys + " " + @sorder

        select @i = @i + 1

    end

    keysdone:

        set nocount off

 

3. 将索引信息存入T_SYS_TABLE_INDEX表

insert into T_SYS_TABLE_INDEX

        select @objname,object_id(@objname),name, @keys, @inddesc, maxrowsperpage, fill_factor,

            isnull(res_page_gap,0), crdate, 

            case when (status3 & 8 = 8) then "Local Index"

                 else "Global Index"

            end

            from sysindexes where id = object_id(@objname) and indid = @indid

 

第三步:循环获取当前库中每一张表的索引信息

DECLARE @table_name VARCHAR(600)

DECLARE @table_id INT

DECLARE @last_table_id INT 

select @table_id = min(id) from sysobjects where  type = 'U'

while @table_id is not NULL

BEGIN

  SELECT @table_name = name FROM sysobjects WHERE type ='U' AND id = @table_id

  EXEC sp_genIndexInfo @table_name

  select @last_table_id = @table_id

  select @table_id = NULL

  select @table_id = min(id),@table_name=name from sysobjects where id > @last_table_id and type = 'U'

END

 

第四步:查询未建索引的表和字段

SELECT db_name() AS dbname,obj1.name AS table_name,cols.name AS col_name 

FROM syscolumns cols LEFT JOIN sysobjects obj1 ON cols.id = obj1.id 

WHERE obj1.type = 'U' 

AND cols.name like 'C_BH_%' AND cols.length = 32

AND NOT EXISTS (

  SELECT 1 FROM  T_SYS_TABLE_INDEX tis WHERE tis.table_id = obj1.id AND charindex(cols.name,tis.index_keys) >0

)

ORDER BY obj1.name desc

 

四、 结果展示

1、 全库已建索引信息

 

2、 全库未建外键索引信息

 

通过程序或脚本可以将未建索引的外键字段批量生成建立索引脚本。

五、 结论

Sybase ASE的系统表相当于其他DBMS的数据字典,记录和展示了数据库的元数据信息,利用这些信息DBA和程序员可以做很多的批量处理工作,减少手工劳动,提高效率!

本文档详细介绍了sybase ASE的从基本感念到具体的详细的操作,目录如下: 1. 基本概念篇 5 1.1 什么是Sybase Adaptive Server Enterprise (ASE)? 5 1.2 Sybase 具有哪些Server以及这些Server的用途? 5 Backup Server 5 1.3 什么是登录帐户? 5 1.4 什么是角色,Sybase具有哪些常用的系统角色以及这些系统角色的作用? 5 1.5 什么是超级用户,它具有哪些特点? 6 1.6 什么是数据库设备? 7 1.7 什么是数据库? 7 1.8 Sybase具有那些重要和必要的系统数据库,它们的作用分别是什么? 7 1.9 什么是数据库用户,以及登录帐户与数据库用户的区别? 7 1.10 什么是用户定义组? 7 1.11 什么是数据库的属主? 8 1.12 什么是数据库选项,Sybase具有那些常用的数据库选项? 8 1.13 什么是数据库一致性检查,Sybase具有哪些常用的检查命令? 9 1.14 什么是 APL和DOL,它们的特点和区别? 9 1.15 什么是Sybase的锁,它具有哪些类型以及这些锁的作用? 9 1.16 什么是数据库备份和恢复? 11 2. 日常维护篇 12 2.1 常规数据库服务器维护的基本要点和步骤? 12 2.2 例行数据库备份恢复策略和必要步骤? 13 2.3 查找定位数据库服务器性能问题的常用工具和方法? 14 2.4 开发数据库应用时需要开发人员重点关注的几个问题? 18 2.5 如何在Windows 平台上启动和关闭Sybase数据库服务器? 18 2.6 如何在UNIX平台上启动和关闭Sybase数据库服务器? 18 2.7 如何使用交互式管理工具isql? 19 2.8 如何在Windows操作系统上安装Open Client12.0 19 2.9 如何使用图形化管理工具Sybase Central? 19 2.10 如何使用图形化管理工具Dsedit实用程序? 22 2.11 如何创建登录帐户? 26 2.12 如何修改自己以及其登录帐户的口令? 26 2.13 如何查看登录帐户的信息? 27 2.14 如何设置登录帐户的缺省数据库? 27 2.15 如何为登录帐户授予系统角色? 27 2.16 如何创建数据库设备? 28 2.17 如何把数据库设备设置为缺省设备? 28 2.18 如何镜像数据库设备和取消数据库设备镜像? 28 2.19 如何创建数据库? 29 2.20 如何在Sybase Central中配置Monitor Server? 30 2.21 如何配置用户自定义命名缓存以及缓冲池? 30 2.22 如何扩展数据库? 31 2.23 如何设置数据库为单用户模式? 31 2.24 如何把数据库设置为自动截断事务日志? 31 2.25 为了可以在用户事务中执行数据定义语言,应如何设置数据库选项? 32 2.26 如何设置数据库选项可以在用户中自动添加序号生成器? 32 2.27 如何为数据库创建数据库用户? 32 2.28 如何创建用户自定义组? 32 2.29 如何改变用户自定义组中数据库用户? 33 2.30 如何查看数据库空间的大小? 33 2.31 如何改变数据库的属主? 33 2.32 如何执行sp_configure 系统存储过程来查看系统参数? 33 2.33 如何为当前的Sybase数据库服务器设置最大可用内存? 34 2.34 影响数据库服务器内存配置的基本参数 34 2.35 如何为当前的Sybase ASE 12.5设置可用的数据缓存? 35 2.36 如何为当前的Sybase ASE 12.5设置可用的过程缓存? 35 2.37 如何为当前的Sybase数据库服务器设置可用的最大数据库设备数量? 35 2.38 如何为当前的Sybase数据库服务器设置可用的最大锁数? 36 2.39 如何为当前的Sybase数据库服务器设置可用的最大用户连接数? 36 2.40 如何备份数据库? 36 2.41 如何进行数据库的增量备份? 37 2.42 如何恢复数据库? 37 2.43 如何截断数据库的事务日志? 38 2.44 如何恢复数据库到某一具体时间? 38 2.45 如何把、索引等数据库对象的定义从数据库中导出来? 38 2.46 如何把整个数据库中所有用户的数据全部导出来? 39 2.47 如何执行快速bcp操作? 39 2.48 如何查看当前数据库中的进程信息? 39 2.49如何查看当前数据库中锁发生的情况? 40 2.50 如何更改用户的锁模式? 40 2.51 如何执行optdiag命令来监控和索引的物理使用情况? 40 2.52 如何执行reorg 系列命令来优化Dol及其索引? 41 2.53 如何使用sp_sysmon存储过程来查看当前数据库的性能情况? 41 3. 技术专刊 43 3.1 关于Backup Server 43 3.2 Backup Server的名字 46 3.3 Sybase的数据库设备 47 3.4 数据库选项(dboptions)的使用与管理 48 3.5 Index & Performance 51 3.6 SYBASE ASE 事务日志 55 3.7 阀值管理(Threshold Management) 60 3.8 日常后备数据库 64 3.9 使用dump transaction with no_log的危险性 65 3.10 在ASE 11.9.2版中采用了行级加锁机制以提高性能 65 3.10.1 所支持的加锁机制 66 3.10.2 对小量数据的多次并发访问 70 3.10.3 堆栈和热点 73 3.10.4 死锁 74 3.10.5 何时使用不同类型的加锁方法 77 3.10.6 结论 79 3.11 DBCC 79 3.12 Sybase ASE的字符集 84 3.12.1 概念 84 3.12.2 配置 89 3.12.3 错误处理 96 3.12.4 附:如何安装cp936字符集 97 4. 提高篇 98 4.1 为什么数据库事务日志满了,使用dump tran with no_log仍不能截断日志? 98 4.2 如何后备数据量大于2GB的数据库 98 4.3 如何更改ASE名称(在UNIX、OPENVMS平台上) 99 4.4 如何在HP平台BCP OUT超过2G的数据 99 4.5 如何将ASE SERVER移植到同种平台(相同操作系统)的系统上 100 4.6 如何扩展master数据库空间 103 4.7 Invalid tdslength value 105 4.8 如何将master设备从UNIX的文件系统移到裸分区 106 4.9 如何生成bcp命令文件(以pubs2为例) 107 4.10 如何动手修改interfaces文件 107 4.11 关于tempdb的优化 108 4.12 ASE12.5.x的一条有用的命令: disk resize 110 4.13 如何更改字符集为cp936 110 5. 灾难恢复篇 111 5.1 数据库服务不能启动 111 5.1.1 如何查找数据库启动失败原因 111 5.1.2 简单故障及排除方法 111 5.1.3 master数据库日志满了,server无法启动,怎么办 (error 1105) 112 5.1.4 SQL Server 10.x配置内存过大、Server不能启动时怎么办? 113 5.2 数据库被挂起 113 5.2.1 如何解决数据库被挂起的问题(error 926) 113 5.2.2 如何做 rebuild log 116 5.3 数据库恢复 118 5.3.1 如何删除坏的用户数据库?(以pubs2为例) 118 5.3.2 如何做Rebuild Master 119 5.3.3 如何恢复master数据库 121 5.3.4 如何移植master设备 123 5.3.5 如何重建sybsystemprocs系统数据库 125 5.3.6 如何挽救 corrupt table 中的数据 126 5.3.7 Recovering the master Database or Master Device under ASE 12.5 128 5.3.8 如何只用数据库设备文件生成新的数据库服务器 136 5.3.9如何单独在备份机上启动Sybase ASE12.5 (ASE HA) 139 5.4 数据库恢复以后的工作 140 5.4.1 如何检查数据库中数据的一致性 140 6. SYBASE培训服务 143 6.1 SYBASE培训概述 143 6.2 SYBASE主要数据库培训班介绍 144 7. 如何获得帮助 145 7.1 热线电话 145 7.2 Sybase技术文档 145 7.3 Sybase网上资源 145 7.4 您的建议 146
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值