远程Sybase数据库技术支持,联系手机:13811580958,QQ:289965371!

 

随着Sybase被完全整合到SAP下,Sybase原来的支持网站被SAP Support Portal取代。
只有购买了SAP服务的用户才能使用账号登录SAP Support Portal进行介质下载、补丁升级、报Incident等。
目前,原Sybase所有产品(包括:Adaptive Server Enterprise、Sybase IQ、Replication Server、PowerDesigner等)的官方手册仍然可以从http://infocenter.sybase.com/help/index.jsp进行浏览或下载。暂不清楚该网站http://infocenter.sybase.com/help/index.jsp何时会被完全迁移到SAP Support上!
Sybase官方手册英文版有html和pdf两种格式,而中文版手册只有pdf一种格式。为了国内Sybase用户更方便、快捷地搜索Sybase常见产品的官方手册内容,特将中文版Sybase官方手册转为html格式!
Sybase产品官方手册中文版的html格式所有内容的版权归SAP公司所有!本博客站长是Sybase数据库的铁杆粉丝!

如有Sybase数据库技术问题需要咨询,请联系我!

  QQ :289965371 点击这里给我发消息
  Email:

以下官方手册为ASE 15.7 ESD#2中文版:

  1. 新增功能公告 适用于 Windows、Linux 和 UNIX 的 Open Server 15.7 和 SDK 15.7
  2. 新增功能摘要
  3. 新增功能指南
  4. ASE 15.7 发行公告
  5. 配置指南(windows)
  6. 安装指南(windows)
  7. 参考手册:构件块
  8. 参考手册:命令
  9. 参考手册:过程
  10. 参考手册:表
  11. Transact-SQL® 用户指南
  12. 系统管理指南,卷 1
  13. 系统管理指南,卷 2
  14. 性能和调优系列:基础知识
  15. 性能和调优系列:锁定和并发控制
  16. 性能和调优系列:监控表
  17. 性能和调优系列:物理数据库调优
  18. 性能和调优系列:查询处理和抽象计划
  19. 性能和调优系列:使用 sp_sysmon 监控 Adaptive Server
  20. 性能和调优系列:利用统计分析改进性能
  21. 程序员参考 jConnect for JDBC 7.0.7
  22. Adaptive Server Enterprise 中的 Java
  23. 组件集成服务用户指南
  24. Ribo 用户指南
  25. 内存数据库用户指南
  26. Sybase Control Center for Adaptive Server® Enterprise
  27. 安全性管理指南
  28. 实用程序指南

 


< 上一个 | 内容 | 下一步 >

选择索引


进行索引选择时,也许会思考这些问题:

当前哪些索引与给定表关联?

哪些是使用表的最重要的进程?

select 操作与对表执行的数据修改的比率是多少?

为表创建聚簇索引了吗?


非聚簇索引能替换聚簇索引吗?

任何索引都能覆盖一个或多个关键查询吗?

需要组合索引来强制实现复合主键的唯一性吗?

现有查询是否包含可使用基于函数的索引加速的表达式?

哪些索引可定义为唯一?

主要的排序要求有哪些?

某些查询使用降序排序的结果集吗?

索引支持连接和参照完整性检查吗?

建立索引会影响更新类型 (直接与延迟)吗?

游标定位需要哪些索引?

如果需要脏读,有唯一索引来支持扫描吗?

应将 IDENTITY 列添加到表和索引以生成唯一索引吗?可更新的游 标和脏读需要唯一索引。

决定使用多少索引时,应考虑:

空间约束

表的访问路径

数据修改对选择操作的百分比

报告与 OLTP 相比的性能要求

索引变化对性能的影响

可以使用 update statistics 的频率


索引键和逻辑键


必须将索引键与逻辑键区别开来。逻辑键是数据库设计的一部分,用于 定义各表间的关系:主键、外键和公用键。

通过创建索引优化查询时,逻辑键可以用作或者也可不用作物理键来创建 索引。可在不属于逻辑键的列上创建索引,也可不将逻辑键用作索引键。

为改善性能,应选择索引键。应将索引创建在查询中支持连接、搜索参 数和排序要求的列上。

为一个表在主键上创建聚簇索引是一个常见的错误,即使它不用于范围 查询或对结果集进行排序。


聚簇索引准则


以下是适用于聚簇索引的常规准则:

大多数所有页锁定表都应有聚簇索引或者应使用分区,以减少对堆 表的最后一页的争用现象。

在一个事务密集的环境中,对最后一页的锁定会使吞吐量受到严重 的限制。

如果您的环境需要进行大量插入,则不要将聚簇索引键放在稳定增 加的值上,例如 IDENTITY 列。应选择具有如下特点的键:可将插 入内容放置在随机页中以最大程度地减少锁争用情况,同时又能在 许多查询中保持可用。通常,主键并不符合这一条件。

对于 DOL 锁定表而言,这个问题并不很严重,而对于所有页锁定表 而言,它经常是发生锁争用的主要起源。

当范围查询中此键与搜索参数匹配时,聚簇索引会提供优良的性 能,如:

where colvalue >= 5 and colvalue < 10

在所有页锁定表中,行按键顺序排序,页按顺序链接,从而令使用 聚簇索引的查询可以非常快速地进行。

DOL 锁定表中,在创建索引后,行按键顺序排序,但聚簇程度 会随着时间的推移而下降。

对聚簇索引键来说,其它较好的选择是使用 order by 子句和连接中 的列。

如有可能,对于所有页锁定表,不要将频繁更新的列包含在聚簇索 引的键中。

当这些键被更新后,对应行必须从当前位置移动到新页中。而且, 如果索引为聚簇索引,而非唯一索引,则更新会按延迟模式执行。


选择聚簇索引


应依据执行的 where 子句或连接的种类来选择索引。聚簇索引的选择有:

主键,当它用于 where 子句和能将插入操作随机化时。

按范围访问的列,例如:

col1 between 100 and 200

col12 > 62 and < 70


order by 使用的列

不频繁变化的列

连接中使用的列 如果存在几种可能的选择,应选择最常用的物理顺序作为第一选择。

其次,应查找范围查询。在性能测试期间,检查是否由于锁争用而出现 “热点”。


非聚簇索引的候选项

选择非聚簇索引的列时,应考虑不符合聚簇索引选择的所有用法。此外, 还应查看能通过索引覆盖使性能得以改善的列。

DOL 锁定表中,聚簇索引可执行索引覆盖,因为它们具有在数据级 之上的一个叶级。

在所有页锁定表中,非覆盖范围查询对于聚簇索引工作正常,但可能不 被非聚簇索引支持,这取决于范围的大小。

应考虑使用组合索引来覆盖关键查询和支持不太频繁的查询:

最关键的查询应能够执行点查询和匹配扫描。

其它查询应能够使用索引执行非匹配扫描,这样可避免表扫描。


选择基于函数的索引

基于函数的索引可以提供耗费较少的选项,用于增强某些旧版应用程序 的性能。

基于函数的索引能让您直接根据一个或多个表达式创建索引 (请参见

Transact-SQL 用户指南》)。当构建索引时,对每个行求解表达式的结 果存储为索引键值,而不在查询执行时重新求解。这意味着, SQL 查询 内的表达式的结果可以极快。如果没有基于函数的索引,通常需要进行 表扫描来对表中的每个行求解表达式以进行比较。 Adaptive Server 创建 一个隐藏的计算列 (其中包含求解的键表达式)并对该列编制索引。

对于需要对列值应用函数或操作并将结果与同一行中的另一列或者常量 或变量进行比较的查询,可以有效地使用基于函数的索引。


还可以通过向表中添加含有索引的物化计算列,并重写查询以使用索引 计算列,来提高基于函数的索引的性能。这对于新应用程序开发是个好 方法。基于函数的索引的优势是,您只需在现有表中添加与现有查询中 使用的表达式相匹配的索引。这样,您就能够在最低限度增加模式且无 需更改 SQL 查询代码的情况下提高旧版应用程序的性能。


索引选择


索引选择可使您确定哪些索引正被频繁地使用,哪些极少使用。

本节假定已经设置了监控表功能。有关安装和使用监控表的信息,请参 见 Performance and Tuning Series: Monitoring Tables (《性能和调优系列: 监控表》)。

索引选择使用监控访问表 monOpenObjectActivity 的以下各列:

IndexID — 索引的唯一标识符。

OptSelectCount — 报告优化程序将相应对象 (例如表或索引)用作 访问方法的次数。

LastOptSelectDate — 报告 OptSelectCount 上一次递增的时间。

UsedCount — 报告执行查询时将相应对象 (例如表或索引)用作访 问方法的次数。

LastUsedDate — 报告 UsedCount 上一次递增的时间。

如果一个计划已被编译和缓存,则每次执行该计划时 OptSelectCount 不 会递增。但执行一个计划时 UsedCount 会递增。如果 no exec 打开, OptSelectCount 会递增,但 UsedCount 不会。

监控数据不是固定不变的。也就是说,当重新启动服务器时,监控数据 将被重新设置。仅为活动对象报告监控数据。例如,没有打开的对象不 存在监控数据,因为此类对象没有活动对象描述符。如果系统配置不合 适且具有重新使用的对象描述符,这些对象描述符的监控数据将被重新 初始化,以前的对象的数据将丢失。当旧的对象重新打开时,其监控数 据将被重新设置。


索引选择使用示例


下面的示例向监控表查询特定对象的所有索引上一次被优化程序选中的 时间,以及它们上一次在执行中被实际使用的时间,然后报告每种情况 下的使用次数:

select DBID, ObjectID, IndexID, OptSelectCount, LastOptSelectDate, UsedCount,

LastUsedDate

from monOpenObjectActivity

where DBID=db_id("financials_db") and ObjectID = object_id('financials_db..expenses')

order by UsedCount

此示例显示应用程序中使用 (或当前没有使用)的所有索引:

select DBID, ObjectID, IndexID, ObjectName = object_name(ObjectID, DBID),

LastOptSelectDate, UsedCount, LastUsedDate from monOpenObjectActivity

where DBID = db_id("MY_1253_RS_RSSD")

and ObjectID = object_id('MY_1253_RS_RSSD..rs_columns') DBID ObjectID IndexID ObjectName LastOptSelectDate UsedCount LastUsedDate

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

4

192000684

0

rs_columns

May 15 2006

4:18PM

450 May 15

4

192000684

1

rs_columns

NULL

0 NULL

4

192000684

2

rs_columns

NULL

0 NULL

4

192000684

3

rs_columns

May 12 2006

6:11PM

1 May 12

4

192000684

4

rs_columns

NULL

0

NULL

4

192000684

0

rs_columns

May 15 2006

4:18PM

450 May 15

4

192000684

1

rs_columns

NULL

0 NULL

4

192000684

2

rs_columns

NULL

0 NULL

4

192000684

3

rs_columns

May 12 2006

6:11PM

1 May 12

4

192000684

4

rs_columns

NULL

0

NULL

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


2006 4:18PM


2006 6:11PM


4 192000684 5 rs_columns

NULL 0 NULL

如果未使用索引,它会生成 NULL 日期。如果使用了索引,它会生成类 似 “May 15 2006 4:18PM”的日期。

在此示例中,查询显示当前数据库中当前没有使用的所有索引:

select DB = convert(char(20), db_name()),

TableName = convert(char(20), object_name(i.id, db_id())), IndexName = convert(char(20),i.name),

IndID = i.indid

from master..monOpenObjectActivity a, sysindexes i where a.ObjectID =* i.id

and a.IndexID =* i.indid


and (a.UsedCount = 0 or a.UsedCount is NULL) and i.indid > 0

and object_name(i.id, db_id()) not like "sys%" order by 2, 4 asc

DB TableName IndexName IndID

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

MY_1253_RS_RSSD rs_articles rs_key_articles 1

MY_1253_RS_RSSD rs_articles rs_key4_articles 2

MY_1253_RS_RSSD rs_classes rs_key_classes 1

MY_1253_RS_RSSD rs_classes rs_key2_classes 2

MY_1253_RS_RSSD rs_config rs_key_config 1

MY_1253_RS_RSSD rs_databases rs_key_databases 1

MY_1253_RS_RSSD rs_databases rs_key9_databases 2

MY_1253_RS_RSSD rs_databases rs_key13_databases 3

MY_1253_RS_RSSD rs_databases rs_key14_databases 4

MY_1253_RS_RSSD rs_databases rs_key15_databases 5

MY_1253_RS_RSSD rs_datatype rs_key_datatypes 1

MY_1253_RS_RSSD rs_datatype rs_key2_datatype 2

其它索引建立准则


以下是选择索引时的其它注意事项:

如果索引键是唯一的,可将它定义为唯一的,从而使优化程序立即 就能够知道只有一行与搜索参数或键上的连接相匹配。

如果数据库设计使用了参照完整性(create table 语句中的 references 关键字或 foreign key...references 关键字),则所引用的列必须有唯一 的索引,否则尝试创建参照完整性约束时将会失败。

Adaptive Server 不会自动在引用列上创建索引。如果应用程序更 新主键或从主键表中删除行,则您也许要在引用列上创建一个索引, 使这些查找不执行表扫描。

如果您的应用程序使用游标,请参见 Performance and Tuning Series: Query Processing and Abstract Plans (《性能和调优系列:查询处理 和抽象计划》)的 “游标的优化”中的 “游标对索引的使用及要求”。

如果在将会有大量 insert 活动的表上创建一个索引,可使用 fillfactor

临时将页面拆分最小化,提高并发性,最大限度地减小死锁的可能。

如果在一个只读表中创建一个索引,可使用 fillfactor 100 使该表或索 引尽可能紧凑。

使键的大小尽可能小。索引树更加平展,加速对树的浏览。

只要与设计相符,应尽量使用较小的数据类型。


在内部,数值型数据的处理速度比字符串型数据略微快一些。

可变长度的字符和二进制型数据比固定长度型的数据需要更多 的行开销,因此如果列的平均长度和定义的长度没有多少差 别,则应使用固定长度。依据定义,接受空值的字符和二进制 类型属于可变长度类型。

如有可能,对将用作索引键的短列应使用固定长度、非空值类型。

应确保不同表中的连接列的数据类型相互兼容。如果 Adaptive Server 必须转换连接一侧的数据类型,则不能对该表使用索引。


选择非聚簇索引


考虑添加非聚簇索引时,必须在缩短检索时间和增加数据修改时间之间 进行利弊的权衡。此外,还应考虑:

索引使用多少空间?

候选列的易变程度如何?

索引键的选择性如何?使用扫描效果会更好吗?

有许多重复值吗?

由于存在数据修改开销,因此只有在经过测试表明添加非聚簇索引非常 有帮助时,才可以添加它们。


数据修改的性能开销


对于所有锁定方案,每个非聚簇索引都需要对表中的每个插入和每个删 除进行更新。

如果对表的更新是更改某个索引的键部分,则只需更新索引即可。 对于所有页锁定表而言,需要为以下内容更新所有索引:

通过更新聚簇索引键改变行位置的更新操作,使行移动到另一页中

受数据页面拆分影响的每一行

对于所有页锁定表,在事务的持续期间,事务持有对受影响索引页的排 它锁,从而增加了锁争用情况和处理开销。

当表中三个或四个索引经历大量的数据修改时,有些应用程序将经受无 法接受的性能影响。而其它应用程序能够正常处理多个表。


选择组合索引


如果分析结果表明某聚簇索引键有多个合适的候选列时,则可为类似聚 簇的访问提供覆盖特定查询或查询组的组合索引。它们包括:

范围查询。

矢量 (分组)集合 (如果包括被分组列和分组列)。索引中也必须 包括所有搜索参数。

返回大量重复值的查询。

包括 order by 的查询。

进行表扫描但使用表中列的较小子集的查询。

只要数据库有足够的可用空间,便可对只读或共享表进行多重索引。更 新活动少而选择活动多时,应为所有常用的查询提供索引。务必对索引 覆盖的性能优势进行测试。


组合索引中的键排序和性能

当使用前导列时,覆盖查询可为特定查询提供卓越的响应时间。

au_lnameau_fnameau_id 上使用组合的非聚簇索引,可使此查询非 常快地运行:

select au_id

from authors

where au_fname = "Eliot" and au_lname = "Wilk"

此覆盖点查询只需读取索引的上级和 5000 行表的非聚簇索引中叶级行 的单个页。

此外观类似的查询 (使用相同的索引)不能很好地执行。此查询仍是 覆盖查询,但对 au_id 进行搜索:

select au_fname, au_lname from authors

where au_id = "A1714224678"

由于此查询不包括索引的前导列,因此它必须扫描索引的整个叶级,执 行大约 95 个读操作。

将一列添加到上述查询的选择列表中,这似乎是一个很平常的改动,但 会使性能更加恶化:

select au_fname, au_lname, phone from authors

where au_id = "A1714224678"


此查询执行表扫描,读取 222 页。在这种情况下,性能会显著地下降。 对于任何不是前导列的搜索参数, Adaptive Server 只有两种可能的访问 方法:表扫描或覆盖索引扫描。

它不为非前导搜索参数扫描索引的叶级和访问数据页。组合索引只能在 它覆盖查询或第一列出现在 where 子句中的情况下使用。

对于包括组合索引的前导列的查询,添加不包括在此索引中的列只能添 加一次数据页读取。此查询必须读取数据页以找到电话号码:

select au_id, phone from authors

where au_fname = "Eliot" and au_lname = "Wilk"

6-2 显示在表中有一个 au_lnameau_fnameau_id 的非聚簇索引而没 有其它索引的情况下,不同 where 子句的性能特点。

6-2:组合非聚簇索引排序和性能

image

image

where 子句中的列 索引列在选择列表中的性能 与其它列在选择列表中的性能

au_lname

au_lnameau_fname

image

au_lnameau_fnameau_id

良好;使用索引减少了树层; 不访问数据级

良好;使用索引减少了树层; 访问数据 (每行多一个页读取)

au_fname

au_id

au_fnameau_id

中等;扫描索引以返回值 差;未使用索引,进行了表扫描

image


选择组合索引的排序,使多数查询形成前缀子集。


组合索引的优缺点


组合索引具有以下优点:

组合索引为索引覆盖提供机会。

如果查询提供每个键的搜索参数,则组合索引需要的 I/O 比使用任 何单一属性索引的相同查询需要的要少。

组合索引是强制实现多个属性的唯一性的极佳方式。 对于组合索引的较好选择有:

查找表

同时频繁访问的列

用于矢量集合的列

组成极宽行表的常用子集的列


组合索引的缺点有:

组合索引可能会出现有大条目的现象。也就意味着每个索引页中的 索引条目更少而需要读取的索引页更多。

对组合索引任何属性的更新都会产生修改索引的需要。因此,选择 的列不应是经常更新的列。

不当的选择有:

几乎与数据行一样宽的索引行

where 子句中只使用了一个次键的组合索引


DOL 锁定索引使用 online reorg rebuild

可以对 DOL 索引运行 online reorg rebuild index 来重新压缩数据、从以前 的释放所留下的空间中收集碎片、重新组织数据以提高索引页集群化比 率。运行 online reorg rebuild index 可减少索引需要的空间,并在提高集群 化的同时改进查询的执行。




--------------------------------------华丽的分割线-------------------------------------------------------------------------
之前就已经研发成功了能够从Sybase SQL Anywhere的DB文件中恢复数据的工具:ReadASADB。
此工具支持ASA v5.0,v6.0,v7.0,v8.0,v9.0,v10.0,v11.0,v12.0等版本。
恢复Sybase SQL Anywhere的工具在国内应该算首创。

ReadASADB功能
能够从损坏的SQL Anywhere数据文件(.db)和UltraLite数据文件(.udb)上提取数据的非常规恢复工具

  1. 适用于所有的SQL Anywhere版本    包括:5.x,6.x,7.x,8.x,9.x,10.x,11.x,12.x
  2. 适用于所有的UltraLite版本
  3. 能够恢复出来表结构和数据
  4. 能够恢复自定义数据类型
  5. 能够恢复存储过程等对象的语法
  6. 能够导出到目标数据库
  7. 能够导出到SQL文件并生成导入脚本
  8. 支持多种字符集  包括:cp850、cp936、gb18030、utf8等
  9. 能够恢复未加密或者简单加密类型的数据
  10. 简单易用
  11. 限制:不支持AES加密的数据文件
请参考:研发成功了从Sybase SQL Anywhere的DB文件上恢复数据的工具
            SQL Anywhere数据库非常规恢复工具ReadASADB使用介绍

ReadASADB适用场景

各种误操作:

  1. 误截断表(truncate table)
  2. 误删除表(drop table)
  3. 错误的where条件误删数据
  4. 误删除db或log文件
  5. 误删除表中的字段

本工具的应用场景:

1.因为物理磁盘故障、操作系统、系统软件方面或者掉电等等原因导致的Sybase SQL Anywhere数据库无法打开的情况;
2.误操作,包括truncate table,drop table,不正确的where条件导致的误删除等;
Sybase SQL Anywhere无法打开时,比较常见的错误是:Assertion failed。
如:
1、Internal database error *** ERROR *** Assertion failed:201819 (8.0.1.2600) Checkpoint log: invalid bitmap page -- transaction rolled back
2、Internal database error *** ERROR *** Assertion failed:201819 (8.0.1.2600) Page number on page does not match page requested -- transaction rolled back
3、Internal database error *** ERROR *** Assertion failed:200502 (9.0.2.2451) Checksum failure on page 23 -- transaction rolled back
4、File is shorter than expected
5、Internal database error *** ERROR *** Assertion failed: 201116 Invalid free list index page found while processing checkpoint log -- transaction rolled back
6、*** ERROR *** Assertion failed: 51901 Page for requested record not a table page or record not present on page等等。
+-------------------------------------华丽的分割线-------------------------------------------------------------------------