DBASK-数据库管理员结构化知识体系-Structured knowledge system for DataBase Administrators

Home

通过控制对象放置来提高性能




Transact-SQL 函数。这些函数,用于从数据库中返回信息。在 select 列表中,在 where 子句中,以及在可以使用表达式的任何地方,都可以使用这些函数。它们往往被用作存储过程或程序的一部分。

• 将数据库的数据段放置在一个或多个特定设备上,以便在单独的物理设备上存储数据库日志,从而避免对日志的读写干扰数据访问。

• 跨多个设备分布大的且频繁使用的表。

• 将特定表或非聚簇索引放置在特定设备上。例如,可将表放置在一个跨多个设备的段上,将其非聚簇索引放置在一个单独段上。

• 将表的 text 和 image 页链放在单独设备上,与该表分开。该表存储指向单独数据库结构中的实际数据值的指针,因此每次访问 text 或image 列都至少需要执行两次 I/O 操作。

• 在单独物理磁盘的分区内平均分配表,以使并行查询的性能达到最佳,并提高 insert 和 update 性能。

• 在逻辑和物理设备内均衡划分对象。

• 使用充足的物理设备,包括磁盘控制器,以确保物理带宽。

• 使用更多逻辑设备,以确保最大限度地减少内部 I/O 队列的争用。

• 确定并使用允许进行并行扫描并达到查询性能目标的大量分区。

高速缓存和对象绑定




可将表绑定到特定的高速缓存。如果表未绑定到特定的高速缓存,但其数据库被绑定到某高速缓存,则它的所有 I/O 都发生在该高速缓存中。

否则,表的 I/O 将发生在缺省数据高速缓存中。可以为大 I/O 配置缺省数据高速缓存。使用堆表的应用程序很可能在使用配置为 16K I/O 的高速缓存时性能最佳。

确定表和索引的大小




• optdiag 显示表和索引的大小及许多其它统计信息。

• sp_spaceused 报告现有表和索引的当前大小。

• sp_estspace 可在给定行数参数的情况下预测表及其索引的大小。

对于分区表,sp_helpartition 报告存储在表的每个分区上的页数。

使用 optdiag 显示对象大小




optdiag 命令显示表、索引和列的统计信息,包括表和索引的大小。如果要执行查询调优,optdiag 可提供查看所需的所有统计信息的最佳工具。

以下是 pubtune 数据库中 titles 表的样本报告:

Table owner:                                "dbo"
Statistics for table:                       "titles"    
Data page count:                           662
Empty data page count:              10
Data row count:                           4986
Forwarded row count:                 18
Deleted row count:                      87
Data page CR count:                   86
OAM + allocation page count:        5
First extent data pages:               3
Data row size:                               238

optdiag 的优点

• 可显示数据库中所有表或单个表的统计信息。

• optdiag 的输出包含有助于了解查询开销(如索引高度和平均行长度)的附加信息。

• 经常用于其它调优任务,所以这些报告可能随手可用。

optdiag 的缺点

optdiag 的主要缺点是它会产生大量输出。如果只需要一条信息(如表的页数),使用其它方法会更迅速,系统开销也更低。

使用 sp_spaceused 显示对象大小




系统过程 sp_spaceused 可读取存储在对象的 OAM 页上的值,以提供对象使用空间的快速报告。

sp_spaceused titles
name         rowtotal reserved   data      index_size  unused
------------ -------- ---------- --------- ----------- -------
titles       5000        1756 KB   1242 KB     440 KB     74 KB

rowtotal 值有时可能不准确,因为并不是所有 Adaptive Server 进程都更新OAM 页上的这个值。命令 update statistics、dbcc checktable 和 dbcccheckdb 可更正 OAM 页上的 rowtotal 值。

含义
rowtotal报告估计的行数。该值从 OAM 页上读取。尽管不总是很精确,但与 select count(*) 相比,这种估计的速度要快得多,且引发的争用也较少。
reserved报告供表及其索引使用的保留页。它包括分配给对象的扩充中已使用的和未使用的页。它是 data、index_size和 unused 的合计值。
data报告表所使用的页的千字节数。
index_size报告索引使用的页的总千字节数。
unused报告分配给对象的扩充中未使用的页的千字节数,包括对象索引中未使用的页的千字节数。

要分别报告索引大小,应使用:

sp_spaceused titles, 1
index_name           size       reserved   unused
-------------------- ---------- ---------- ---------
title_id_cix         14 KB      1294 KB    38 KB
title_ix               256 KB     272 KB     16 KB
type_price_ix       170 KB      190 KB     20 KB

name         rowtotal reserved   data      index_size  unused
------------ -------- ---------- --------- ----------- -------
titles       5000       1756 KB   1242 KB     440 KB     74 KB

对于所有页锁定表上的聚簇索引,size 值代表根索引页和中间索引页使用的空间。reserved 值包括索引大小以及未使用和已使用的数据页。

sp_spaceused 语法中的 “1”指示应输出详细的索引信息。它与索引 ID 或其它信息无关。

使用 showplan




· 显示查询计划

若要查看查询计划,请使用:

set showplan on

若要停止显示查询计划,请使用:

set showplan off

您可以将 showplan 和其它 set 命令一起使用

若要对某个存储过程显示查询计划,但不执行这些计划,请使用 set fmtonly 命令。

不要对存储过程使用 set noexec,否则无法进行编译和执行,您也得不到所需输出。

对表和索引运行 reorg




reorg 命令可通过改进表和索引的空间利用率来改善 DOL 锁定表的性能。reorg 子命令及其使用方法:

• forwarded_rows — 将转移的行返回到主页。

• compact — 可执行上述两项操作。

• rebuild — 重建整个表或索引。可对所有页锁定表和 DOL 锁定表使用 reorg rebuild。

在对表运行 reorg rebuild 时,会在重建表及其索引的整个过程中锁定该表。当用户不需要访问该表时,可对表安排执行 reorg rebuild 命令。

所有其它 reorg 命令(包括对索引执行的 reorg rebuild)将一次锁定少量页面,并使用短期的独立事务来执行其工作。可随时运行这些命令。唯一的负面影响可能是对 I/O 非常密集的系统的影响。

创建和维护索引




在用户创建索引时,将对所有其他用户锁定表。锁类型取决于索引类型:

• 创建聚簇索引需要一排它表锁来锁定所有表活动。由于聚簇索引中的行按索引键的顺序排列,因此 create clustered index 将对数据页重新排序。

• 创建非聚簇索引需要一共享表锁来锁定更新活动。

临时数据库tempdb




临时数据库是一种全服务器范围的资源,主要用于处理排序、创建工作表、重新格式化以及存储用户创建的临时表和索引。任何人都可以在临时数据库中创建对象。许多进程在使用这些数据库时都不会有任何提示。

许多应用程序都使用在临时数据库中创建表的存储过程来加快复杂连接的速度,或执行其它不易在单步中执行的复杂数据分析。

• 配置数目足够多的用户临时数据库。

• 为所有 Adaptive Server 活动适当调整临时数据库的大小。

• 以最佳方式放置临时数据库以减少争用。

• 尽可能减少临时数据库中的资源锁定。

• 将临时数据库绑定到其自身的数据高速缓存。

• 正确配置临时数据库组。

• 将登录名和应用程序绑定到相应的临时数据库或临时数据库组。

查找慢速运行的查询




Adaptive Server 包括 set show_sqltext、set tracefile 和 set export_options 参数,您可以使用这些参数收集有关运行速度慢的查询的诊断信息,而无需事先启用 showplan 或其它检查参数。

将诊断信息保存到跟踪文件中

启用跟踪功能后,set tracefile 便会将当前会话的所有 SQL 文本保存到指定文件中,每个 SQL 文本批处理都会附加到上一个批处理之后。

启用跟踪的语法为:

set tracefile file_name [off] [for spid

禁用跟踪的语法为:

set tracefile off [for spid

• file_name — 是保存 SQL 文本的文件的完整路径。如果不指定目录路径,Adaptive Server 将在 $SYBASE 中创建该文件。

• off — 为此会话或 spid 禁用跟踪。

• spid — 要将其 SQL 文本保存至跟踪文件的服务器进程 ID。只有具有 SA 或 SSO 角色的用户才能为其它 spid 启用跟踪。不能保存系统任务(如管家或端口管理器)的 SQL 文本。

示例:此示例为当前会话打开一个名为 sql_text_file 的跟踪文件

set tracefile '/var/sybase/REL1502/text_dir/sql_text_file'

设置将诊断信息保存到跟踪文件的选项

可将 set tracefile 与其它可提供诊断信息以便更好地了解慢速查询的 set 命令和选项一起使用。以下是用于将诊断信息保存到文件的 set 命令和选项:

• set show_sqltext [on | off]
 • set showplan [on | off]
 • set statistics io [on | off]
 • set statistics time [on | off]
 • set statistics plancost [on | off]
以下是 set 选项:
• set option show [normal | brief | long | on | off] 
• set option show_lop [normal | brief | long | on | off]
 • set option show_parallel [normal | brief | long | on | off]
 • set option show_search_engine [normal | brief | long | on | off] 
• set option show_counters [normal | brief | long | on | off] 
• set option show_managers [normal | brief | long | on | off]
 • set option show_histograms [normal | brief | long | on | off]
 • set option show_abstract_plan [normal | brief | long | on | off]
 • set option show_best_plan [normal | brief | long | on | off]
 • set option show_code_gen [normal | brief | long | on | off]
 • set option show_pio_costing [normal | brief | long | on | off]
 • set option show_lio_costing [normal | brief | long | on | off]
 • set option show_log_props [normal | brief | long | on | off]
 • set option show_elimination [normal | brief | long | on | off]

显示 SQL 文本




set show_sqltext 可用于为特定查询、存储过程、游标和动态准备的语句输出 SQL 文本。在执行查询以收集 SQL 会话的诊断信息之前,无需启用 set show_sqltext (与 set showplan on 等命令的处理方式相同)。相反,可以在命令运行时启用它,以帮助确定未正常执行的查询并诊断其存在的问题。

在启用 show_sqltext 之前,必须先启用 dbcc traceon,以使输出显示为标准输出:

dbcc traceon(3604)

set show_sqltext 的语法为:

set show_sqltext {on | off}

例如,以下语句将启用 show_sqltext:

set show_sqltext on

启用 set show_sqltext 后, Adaptive Server 便会将您输入的每个命令或系统过程的所有 SQL 文本都输出为标准输出。根据运行的命令或系统,此输出可进行扩展。

例如,如果运行 sp_who,Adaptive Server 将输出与此系统过程关联的所有 SQL 文本(为了节省空间,输出采用缩写形式):

sp_who
2007/02/23 02:18:25.77
 SQL Text: sp_who
 Sproc: sp_who, Line: 0
 Sproc: sp_who, Line: 20
 Sproc: sp_who, Line: 22
 Sproc: sp_who, Line: 25
 Sproc: sp_who, Line: 27
 Sproc: sp_who, Line: 30
 Sproc: sp_who, Line: 55
 Sproc: sp_who, Line: 64
 Sproc: sp_autoformat, Line: 0
 Sproc: sp_autoformat, Line: 165
 Sproc: sp_autoformat, Line: 167
 Sproc: sp_autoformat, Line: 177
 Sproc: sp_autoformat, Line: 188
 . . . 
Sproc: sp_autoformat, Line: 326
 Sproc: sp_autoformat, Line: 332
 SQL Text: INSERT 
#colinfo_af(colid,colname,usertype,type,typename,collength,maxlength,autoform...
...
0 2 sleeping NULL NULL NULL 0 master tempdb  DEADLOCK TUNE 0
 0 3 sleeping NULL NULL NULL 0 master tempdb  ASTC HANDLER 0
 0 4 sleeping NULL NULL NULL 0 master tempdb  CHECKPOINT SLEEP 0

若要禁用 show_sqltext,请输入:

set show_sqltext off

抓取SQL ----常用

dbcc traceon(3604)
go
dbcc sqltext(spid)             ----spid为拟抓取的进程号,可通过sp_who、select * from master..sysprocesse等方式查询
go

绑定缓存示例




调整默认缓存值:

sp_cacheconfig 'default data cache','20G'  -----可根据需要单独创建数据库、表、索引的缓存

一般创建2k 4k 16缓冲池,需要根据缓存监控结果调整大小

sp_poolconfig 'default data cache','10G',2k               ---2k缓冲池
sp_poolconfig 'default data cache','2G',16k               ---16k缓冲池
sp_helpcache   ----查看缓存配置
sp_helpcache 'default data cache'        ------查看具体缓存及缓冲池

临时数据库优化示例




将 tempdb 绑定到其自己的高速缓存

sp_checonfig "tempdb_cache", 1024M
sp_bindcache "tempdb_cache", tempdb

tempdb 组

create databae tempdb_1 .....
sp_tempdb "add'", "tempdb_1" , "default"        ----新建tempdb_1,绑定tempdb组
sp_tempdb 'show'      -----查看组及成员
sp_tempdb 'bind', 'lg', 'sa', 'GR', 'default'       -----例将登录名“sa”绑定到缺省组

reorg rebuild 示例




对行锁表T1,执行reorg rebuild命令

reorg rebuild T1

建议业务量较小的时候执行,该操作会重建表及索引,消耗I/O资源比重大

页锁和全页锁无法执行该操作,如有需要,可通过bcp导出导入,并重建索引(记得开启并发参数)

慢查询示例




抓取spid

select * from master..syslogshold
sp_lock         ----多执行几次,锁定慢查询spid
select top 10 * from master..sysprocesses where cpu>50(或指定其他数值)

抓取SQL

· 根据spid抓取sql

dbcc traceon(3604)
go
dbcc sqltext(spid)

查看慢sql执行计划

set noexec on
set showplan on
select 语句

优化查询

根据需要优化索引、统计值、缓存等