SYBASE优化

  • 格式:doc
  • 大小:41.50 KB
  • 文档页数:6

SYBASE优化数据库设计首先进行的是建立描述数据库实体关系的概念模型,当把一个满足第三范式的概念实体关系模型转换成一个关系模型时,有:·实体变换成表·属性变换成列·关系变换成数据的关联(主键和外键关联)满足第三范式并不能保证你的特定应用具有很高的性能。

相反,为了达到提高性能的目的,有选择地背离严格的规范形式是必需的。

一旦你的数据库设计满足了第三范式,你可以谨慎地调整设计以满足你应用的需求。

最后的设计反映了现实世界的存取需求和约束,这可能导致设计与第三范式理论相偏差。

根据你对应用的经验,你可以从以下几方面来精炼你的物理数据库设计:·在适当的地方采用非规范形式·在适当的地方分割表·在适当的地方把表进行分组放入数据库·决定段的使用·决定设备的使用·执行完整性约束规范化产生的表比较小,表所含的记录数也相对比较少·每页含有更多的记录(减少逻辑I/O)·每次I/O包含更多的记录(效率更高)·在cache中能存更多的记录规范化的好处包括:·寻找、排序和建立索引更快,因为表变小了,在每一个数据页有更多的记录,通常你必须处理更多的表,你将能得到更多的索引集(每一个表仅建立一个索引),因此在查询优化时,你将有更大的灵活性·索引查找将会更快,因为索引趋于更小、更短·更多的表可以更好地利用段来管理数据的物理存放·通常在每个表将会建立较少的索引,因此数据的修改命令将会更快·在表中将存在少的空值和冗余数据,使你的数据库更紧密·由于不必维护冗余数据,Trigger执行得更迅速·减少数据修改异常·当你需要调整数据库时,规范化使得概念上更清晰,维护也变得更容易然而一个完全规范化的数据库需要更多的join操作,如果join操作的列存在索引时,join操作通常是很快的(参考第四章),SQL Server已被优化,使索引在cache中保持高的级别,因此每个join仅需1个或2个物理I/O操作来取得每一匹配记录,如查找的记录已在cache 中则花费将会非常低。

基本范式第一范式规则是:·每列必须是原子的,不能被分解成两个或更多的子列·不能有多值列式或重复组·任一行、列位置仅具有一个值第二范式规则是:任一非主键域列必须依赖于整个主键,而不仅仅是主键的一部分。

第三范式规则是:一个非主键列不能依赖于另一个非主键列。

在下列条件下可以进行非规范化操作:·需处理多表、多列·先前已进行了规范化·完全了解对数据进行什么样的操作进行非规范化的理由是:·几乎所有频繁运行的查询需存取join操作的数据集合·当对表进行连接操作时,大部分的应用是对表进行浏览·导出列的计算需要临时表或大量复杂查询非规范化通过以下手段改善性能:·减少join操作·减少表的外键数目·减少索引数,节约存储空间以及减少数据修改时间·预算总和值,也就是说,在数据修改时进行计算而不是在Select时进行·在某些情况下能减少表的数量最普通的非规范化技巧有:·增加冗余列·增加派生列·合并表此外有时,分割规范化的表能改善性能,你可以从两个方向来分割表:·水平分割根据一列或多列的值,把记录放到两个独立的表中垂直分割,把主键和一些列放入一个表中,把主键和其他的列放入另一个表中。

垂直分割在下列情形下使用垂直分割:·一些列比其他列更频繁地被存取·表的一个记录很大,分割表减少了需读的页数根据是否建立索引以及建立的是何种索引,优化器的存取方法有以下选择:·表扫描——从表中读取所有数据页,有时可能达到上百或上千个数据页。

·索引存取——利用索引找到所需的数据页,有时,仅需读取几页。

·索引覆盖——仅利用非聚簇索引取得数据,而不用去读取实际的数据记录,则仅需读取表扫描所要读取的部分页。

使用堆的准则堆对以下表具有应用价值:·表很小且只使用较少的数据页·不需要直接单条的随机记录·不需对结果集排序·具有非唯一记录且具有以上持征·不需进行大量的insert和update操作索引可以有多个层次:·根结点层·叶结点层·中间层次在聚簇索引中,叶结点层页也就是数据页,数据记录根据索引键物理排序,物理排序也就意味着:·一页中的所有条目遵循索引键次序。

·根据数据层的“下一页”指针,以索引键次序读取整个表。

在根和中间页,每一条目指向下一层次的一页。

对聚簇索引和非聚簇索引来说,B-树的工作原理是非常类似的,但也存在一些差别。

在非聚簇索引中:·叶页不同于数据页·叶层次存储表中每条记录的一个键一指针对·叶层次页存储索引键和页指针以及一指向数据页中表的记录偏移的指针,页指针和记录偏移数相结合被称为记录的ID或RID·根和中间层次存储索引键和指向其他索引页的页指针,它们也存储键数据记录的记录ID当键的大小相同时,非聚簇索引比聚簇索引占用更多的空间。

因此为你的应用创建正确的索引集也就意味着优化器能利用索引来:·当存取数据时避免表扫描·直接确定点查询中含特定值的特定数据页·确定范围查询读数据的上、下界·当一索引覆盖一查询时,完全避免表存取·利用有序的数据避免排序此外,你可以创建索引来强制数据唯一以及随机地确定插入时的数据的存储位置。

表扫描可能发生在:·当查询的查找语句不存在索引时·当存在一索引,但优化器认为索引没有用处时·当没有查找参数时不正确的索引导致了差的查询性能,就如没有索引一样,差索引主要表现在:·Select语句执行很长时间·在两表或多表之间执行join花费相当长时间·select操作运行很好,但数据修改操作表现糟糕·点查询(如"where colvalue=3")表现很好,但范围查询(如"where colvalue 73and colvalue <30")表现糟糕太多索引减慢数据修改索引条目太大SQL Server中的索引存在以下限制:·能为每个表创建一个聚簇索引,因为聚簇索引的数据是根据索引键有序存储的。

·最多为每个表创建249个非聚簇索引。

·一个键可由多列组成。

最多可达16列,每索引键的最大字节数为256。

·当你创建一个聚簇索引时,SQL Server在数据库中额外需120%表大小的空间,因为它必须创建表的一个副本以及为索引的根和中间页分配空间,注意120%是经验值;如果具有非常长的键,就需更多的空间。

·引用一致性规则unique 和Primary key创建了唯一的索引来强制对键的限制,缺省条件下,unique限制创建非聚簇索引,primary key限制创建聚簇索引。

在优化查询和索引时,经常使用的查询分析工具列表如下:set showplan on显示查询的查询计划,包括所选择的索引,join次序和工作表set statistics io on显示处理查询时所需的逻辑和物理读写,set statistics time on显示执行查询的时间set noexec on通常和set showplan on一起使用,该命令取消查询的执行。

set noexec on通常和set showplan on一起使用,该命令取消查询的执行。

你可看到优化器所选择的计划,但查询没有执行,在产品系统中,对于返回长结果的或能引起性能问起的查询来说,exec是有用的,注意,当noexec有效时,statisticsio 输出没被显示(因为查询没有执行I/O)dbcc traceon(302)该跟踪标志使你能看到优化器决定是否利用索引的计算。

参看“利用dbcc traceon (302)优化”表6.3 查询优化的高级工具工具功能set forceplan 迫使查询按from子句中指定的次序使用表set table count 立即增加优化的表数select,delete,updata子句:(index...prefetch...mru-lru) 指定查询所使用的索引、I/O大小或cache策略sp_cachestrategy 设置状态位以激活或屏蔽提前预取和取—执行cache策略set statistics io的报告输出意义scan count 表或索引被查找的次数logical readscache中一页被引用的次数physical reads 从磁盘进行读的次数Total writes 写磁盘次数聚簇索引准则聚簇索引有以下一般准则:·大多数表都应有聚簇索引或利用分区来减少对于堆的最后页的竞争,在多事务环境中,对最后一页的加锁严重制约工作效率。

·如果你的环境需很多插入操作,聚簇索引键不应为单调增加值,如INDENTITY列,选择一个键使插入作用在“随机”页上以减少锁竞争,同时在大多数查询中保持有用。

通常,主键不满足这一准则。

·当键与范围查询的查找参数匹配时,聚簇索引能提供非常好的性能,例如:where colvalue >=5 and colvalue<10·其他好的候选聚簇索引键为orderby和group by子句以及join 操作中使用的列何谓查询优化: 查询优化,是一个分析独立的查询过程,以便决定这些查询使用哪些资源,以及这些资源是否可以减少。

对于任一查询,你需要了解它是如何存取数据库对象、对象的大小、以及表的索引,从而决定是不是有可能改善查询的功能,查询处理的步骤执行一个Transact-SQL查询时,SQL Server进行以下几步的处理:1.语法分析、标准化,查询语法分析器保证了SQL 语法是正确的,并且保证了查询中涉及对象都存在。

2.优化查询,分析查询,选择最佳的查询策略。

·分析每一张表·估计每个索引的代价·选择join的顺序·决定最终存取策略3.编译所选查询策略。

4.执行查询,把结果送给用户。

优化问题和问题的根源优化问题的症状如下:·从索引和表的大小来看,一个查询运行得比你想象的要慢得多·一个查询比与它相类似的查询运行慢得多·一个查询突然比通常运行得慢·存储过程体中的查询比它作为一个特定语句执行起来花费时间要长·当你希望查询策略使用索引时,它却显示使用表扫描产生优化问题的根源包括:·最近的索引统计信息未被更新,因此实际的数据分布与SQL Server用来优化查询的数值不匹配·where子句导致优化器选择了不合适的策略·一给定事务所参照的行不适合索引统计所反映的模式·一个索引被用来存取表的大部分·一个关键查询的合适的索引不存在·在对表的修改执行前,一个存储过程体已经编译过了SQL Server为查询优化提供了如下的诊断工具:·set showplan显示一次批处理中每个查询执行的步骤。