使用 Profiler 来快速查看您的数据库中当前运行的 SQL 语句,比较过程的运行时间并分析这些对象在您的数据库中是如何进行交互的。
使用 Profiler 来标识如下问题:
- 死锁和连接阻塞。
- 长期运行并且开销庞大的查询以及重复运行的查询。
- 高开销的隐藏过程,例如,触发器、事件和嵌套的存储过程调用。
- 过程主体中的潜在问题区域。
解决问题时请考虑以下步骤:
- 1. 启动 Profiler,并使用数据库的用户凭据来连接至出现问题的数据库。此用户必须具有 SYS_RUN_PROFILER_ROLE 系统角色才能使用 Profiler。
- 2. 运行应用程序。
当 SQL 语句在数据库中运行时,在 Profiler 的“操作”选项卡中将显示其相应的分析信息。
因为 Profiler 实时显示分析信息,您可以对数据库进行变更并查看其立即产生的效果。
- 3. 保存结果并断开 Profiler 连接。
- 4. 查看结果。
在解决数据库性能较差的问题时,通常情况下首要任务是确定主要原因是应用程序还是数据库服务器。要确定客户端应用程序所消耗的处理时间,可使用 Profiler 中的“操作”选项卡并按单个连接过滤结果。如果来自该连接的不同请求之间存在时间差异,则主要的延迟发生在客户端应用程序内。
参考 Profiler 顶部的“服务器负载”图形来查看有关数据库服务器的 CPU 使用率以及磁盘和网络使用率的数据。当预计数据库服务器会因为执行备份、检查点或其它内部服务器活动而降低性能时,该图也会对时间进行突出显示。
- 5. 当您需要收集更多数据或验证建议更改时,请根据需要重新连接至 Profiler 并重复上述步骤。
在此节中:
启动数据库分析来确定如下问题:死锁和连接阻塞、长时间运行并且开销庞大的查询和性能降低的时间段。
分析您的存储的 SQL 对象(如过程、函数、事件和触发器)来标识可影响系统性能的对象或语句。确定可能的解决方案后,对其进行测试,然后比较您的结果。
使用 [过滤器] 框来过滤 Profiler 中显示的信息,只留下您感兴趣操作的信息。
分析数据库 (Profiler)
启动数据库分析来确定如下问题:死锁和连接阻塞、长时间运行并且开销庞大的查询和性能降低的时间段。
先决条件
您必须具有 SYS_RUN_PROFILER_ROLE 系统角色才能使用Profiler。
上下文
Profiler是一种开发工具,用于实时记录数据库中的活动,并以简单易用的格式显示这些活动。
过程
- 1. 在 Interactive SQL 中,连接到要分析的数据库。
例如,在“连接”窗口中选择“使用连接字符串进行连接”操作并指定以下启动参数:
UID=DBA;PWD=sql;"DSN=SQL Anywhere 17 Demo"
- 2. 启动Profiler并连接到数据库。
- a. 在 Interactive SQL 中,单击“工具”“SQL Anywhere Profiler”。
- b. 当出现提示时,请接受缺省分析选项并单击“确定”。
在Profiler的“操作”选项卡中显示当前运行的 SQL 语句的相关信息。
- 3. 运行应用程序。
- 4. 保存分析数据。单击“文件”“另存为”。
- 5. 单击“文件”“断开连接” 来结束数据库分析。
- 6. 查看分析信息。使用右上角的“过滤器”框来查找您感兴趣的信息。
分析过程、函数、事件和触发器 (Profiler)
分析您的存储的 SQL 对象(如过程、函数、事件和触发器)来标识可影响系统性能的对象或语句。确定可能的解决方案后,对其进行测试,然后比较您的结果。
先决条件
您必须具有 SYS_RUN_PROFILER_ROLE 系统角色以使用Profiler。
上下文
过程分析可提供过程、用户定义的函数、事件、系统触发器和触发器的执行时间测量值。将当前结果保存为基线,然后对过程进行增量更改。在每次更改后运行该过程,然后将新的结果与基线进行比较,以查明更改效果是否符合预期。
过程
- 1. 在 Interactive SQL 中,连接到要分析的数据库。
例如,在“连接”窗口中选择“使用连接字符串进行连接”操作并指定以下启动参数:
UID=DBA;PWD=sql;"DSN=SQL Anywhere 17 Demo"
- 2. 启动Profiler并连接到数据库。
- a. 在 Interactive SQL 中,单击“工具”“SQL Anywhere Profiler”。
- b. 当出现提示时,请接受缺省分析选项并单击“确定”。
在Profiler的“操作”选项卡中显示数据库中当前运行的 SQL 语句的相关信息。
- 3. 在您的应用程序中,执行您想要分析的存储的 SQL 对象。
- 4. 单击Profiler中的“分析”选项卡。
顶部窗格中列出了自您开始分析后已执行的过程、触发器、函数和事件。该列表中显示了已经执行的存储的 SQL 对象。
- 5. 在顶部窗格中,单击您的存储的 SQL 对象。
特定于该对象的详细信息将出现在底部窗格中。
- 6. 查看底部窗格中的内容,其中包括代码中各个行的结果。通常情况下,对于代码中与其它行相比执行时间较长的行,应对其进行分析,并考虑是否能通过更有效的方法来获得相同的功能。
- 7. 单击“基线”来创建当前结果的基线。
- 8. 对代码进行更改并在您的应用程序中重新运行存储的 SQL 对象。
因为Profiler实时显示分析信息,您可以对数据库进行更改并查看立即产生的效果。
- 9. 观察Profiler中的性能变化。
- 10. 重复上述步骤,直到您对变化满意为止。
- 11. 单击“文件”“断开连接” 来结束数据库分析。
过滤器语法 (Profiler)
使用 [过滤器] 框来过滤Profiler中显示的信息,只留下您感兴趣操作的信息。
语法filter_expression{ [ " ] string [ " ] | [ attribute-value-pair ] } ...
attribute-and-value:
user=user-name[,...]
connection=connection-id[,...]
connectionName=connection-name[,...]
connectionName containsstring[,...]
state={blocked | failed | running }
severity={debug | information | warning | error | critical | always}
severity{= | < | > | <>} severity-number
type=operation-type[,...]
date={today | yesterday | this week | last week | day-of-week | date-range}
executionTime{=|<|>}number { hours | minutes | seconds | h | m | s | ms }
blockedTime{=|<|>}number { hours | minutes | seconds | h | m | s | ms }
betweendate-formatanddate-format
AppInfo.appinfo-key=string
AppInfo.appinfo-keycontainsstring
severity-number:
An integer between 0 and 255
date-range:
fromdate-formattodate-format
date-format:
YYYY-MM-DD[ time-format ]
time-format:
HH [:MM[:SS] [ am | pm ] ]
day-of-the-week:
{ Monday|Tuesday|Wednesday|Friday|Saturday|Sunday }
operation-type:
{connect
|consoleMessage
|disconnect
|dropPreparedStatement
|executePreparedStatement
|executeStatement
|internal
|prepareStatement
|webServerMessage
|user-defined-trace-event-name }
appinfo-key:
{ API | EXE | HOST | IP | OS | OSUSER | PID | THREAD | TIMEZONEADJUSTMENT | VERSION }
参数
以下列表包含有关某些参数的其它信息。
- Date和between子句
任何指定的日期指的是语句开始执行的时间。
between子句包括两个指定时间之间任意时间点运行的语句。指定日期必须具有相同的格式。
- AppInfo子句
AppInfo子句根据客户端应用程序的属性(如客户端计算机的 IP 地址、运行此客户端进程的操作系统等)对语句进行过滤。你可以为appinfo-key指定与 AppInfo 连接属性的key值相同的值。例如,指定AppInfo.execontainsdbisql以查看 Interactive SQL 中执行的语句。
- Severity子句
本子句指的是警告或错误消息的严重程度。例如,以下内容为 CREATE TEMPORARY TRACE EVENT 语句的事件严重程度:0=经常、1-50=严重、51-100=错误、101-150=警告、151-200=信息、201-254=调试。
注释
缺省情况下,Profiler会显示所有从其分析的数据库中收集的分析信息。当排除一个特定的问题时,将信息量减少至只显示与你的问题相关的信息,将十分有用。例如,过滤出与特定用户或连接不相关的所有事件。
单击右上角的 [过滤器] 框,然后单击下拉菜单中的 [添加过滤器表达式] 来通过选择不同的过滤器条件创建过滤器表达式。也可使用过滤器语法来创建复杂的过滤器表达式。
将文本用引号引起来使其被视为文字文本。如果引用文本中包含引号,则使用反斜线对其进行转义。如果引用文本中包含反斜线,则除非反斜线后有引号,否则不需要对其进行转义。
过滤器语法中的所有子句并非都适用于所有事件操作类型。例如,consoleMessage 操作类型不具有相关阻塞时间。如果指定的值不适用于操作类型,则该值将被忽略。
示例
过滤器表达式 | 匹配项 |
update | 任何包含 Update词的操作 |
set salary | 任何包含 set salary词组的操作 |
user=dba | 与任何数据库中名为 dba的用户相关的所有操作。 |
type=executeStatementupdate | 所有包含 Update词的操作。 |
type=executeStatementexecutionTime>10 s | 所有执行时间超过 10 秒钟的 SQL 语句。 |
severity=errorerror | 所有具有错误严重程度的操作。 |
type=connect,disconnectdatefrom 9:00 to 9:30 | 发生在当天 9:00 至 9:30 之间的连接和断开连接操作。 |
connection=17 | 所有与连接 ID 17 相关的操作。 |
| 所有应用程序名为 dbisql的操作 |
- 使用以下过滤器来查看所有运行时间大于秒钟的操作:
executionTime>5 s
使用以下过滤器来查看所有运行时间大于 5 秒钟的 SQL 语句:
executionTime>5 s type=ExecuteStatement
使用以下过滤器来查看所有运行时间大于 5 秒钟的 SQL 语句(包括预准备(参数化的)语句):
executionTime>5 s type=ExecuteStatement,ExecutePreparedStatement
- 使用以下过滤器来查看阻塞时间大于毫秒的语句:
blockedTime>10 ms
使用以下过滤器来查看当前处于阻塞状态的语句:
state=blocked
- 使用以下过滤器查看因出错而执行失败的语句:
- 使用以下过滤器来查看用户执行的操作:
- 使用以下过滤器来查看通过进行连接的操作:
- 使用以下过滤器来查看仅由名为的应用程序引起的操作。
- 使用以下过滤器来查看那些仅在当天至之间运行的操作:
severity=error
user=dba
connection=91
appinfo.execontains mlsrv
between 9:15 and 9:20
使用以下过滤器来查看那些仅在 2015 年 1 月 31 日 9:15 至 9:20 之间运行的操作:
between 2015-01-31 9:15 and 2015-01-31 9:20
- 要查看引用表的语句,请打开语句选项卡,然后使用以下过滤器:Customers。