有两种方式显示SQL语句的详细信息:
可以使用“SQL语句详细信息”显示来查看查询计划,并冻结或解冻查询计划。
“SQL语句详细信息”提供冻结或解冻查询计划的按钮。
它还提供了一个Clear SQL Statistics按钮来清除性能统计,一个Export按钮来将一个或多个SQL语句导出到一个文件,以及一个Refresh和Close页面按钮。
SQL语句详细信息显示包含以下部分。 每个部分都可以通过选择部分标题旁边的箭头图标展开或折叠:
Timestamp:最初,创建计划时的时间戳。
这个时间戳会在冻结/解冻之后更新,以记录计划解冻的时间,而不是重新编译计划的时间。
可能必须单击Refresh Page按钮来显示解冻时间戳。
将Plan Timestamp与包含该语句的例程/类的datetime值进行比较,可以知道,如果再次编译该例程/类,它是否使用了相同的查询计划。%Parallel处理,因此不能被冻结。
NULL(空白)计划状态意味着没有关联的查询计划。SELECT Name INTO:n FROM Table WHERE %ID=?
这个查询的WHERE子句是一个相等条件。
此查询不涉及任何循环或任何索引引用。
动态SQL查询(缓存查询)不会被标记为自然查询;
缓存查询的统计数据可能被记录,也可能不被记录。本节还包括五个查询性能统计字段,将在下一节中进行描述。
执行查询会将性能统计数据添加到相应的SQL语句。 此信息可用于确定哪些查询执行得最慢,哪些查询执行得最多。 通过使用这些信息,您可以确定哪些查询将通过优化提供显著的好处。
除了SQL语句名称、计划状态、位置和文本之外,还为缓存查询提供了以下附加信息:
Last Compile Time不同,后者是准备查询的时间。UpdateSQLStats任务会定期更新已完成的查询执行的查询性能统计数据。
这将最小化维护这些统计信息所涉及的开销。
因此,当前运行的查询不会出现在查询性能统计中。
最近完成的查询(大约在最近一个小时内)可能不会立即出现在查询性能统计中。
可以使用Clear SQL Statistics按钮清除这6个字段的值。
InterSystems IRIS不单独记录%PARALLEL子查询的性能统计数据。
%PARALLEL子查询统计信息与外部查询的统计信息相加。
由并行运行的实现生成的查询没有单独跟踪其性能统计信息。
InterSystems IRIS不记录“自然”查询的性能统计数据。 如果系统收集了统计信息,则会降低查询性能,而自然查询已经是最优的,因此没有进行优化的可能。
可以在“SQL语句”选项卡显示中查看多个SQL语句的查询性能统计信息。 您可以按任何列对SQL Statements选项卡列表进行排序。 这使得很容易确定,例如,哪个查询具有最大的平均时间。
还可以通过查询INFORMATION.SCHEMA.STATEMENTS类属性来访问这些查询性能统计数据,如查询SQL语句中所述。
Select mode:编译语句时使用的SelectMode。
对于DML命令,可以使用#SQLCompile Select;
默认为Logical。
如果#SQLCompile Select=Runtime,调用$SYSTEM.SQL.Util.SetOption()方法的SelectMode选项可以改变查询结果集的显示,但不会改变SelectMode值,它仍然是Runtime。#Import宏指令的DML命令,则#Import指令指定的模式将在这里列出。#Import宏指令中指定搜索路径的DML Embedded SQL命令,#Import搜索路径显示在默认模式设置中,并且该模式路径设置为空白。Map 'NameIDX' not defined in table 'Sample.Person', but it was specified in the frozen plan for the query.
删除或添加索引将导致重新编译表,从而更改“最后编译时间”值。
一旦导致错误的条件得到纠正,Clear Error按钮可用于清除Plan Error字段——例如,通过重新创建缺失的索引。
在错误条件被纠正后使用“清除错误”按钮会导致“计划错误”字段和“清除错误”按钮消失。语句在以下例程部分中定义:
Routine:与缓存查询关联的类名(对于动态SQL DML),或者例程名(对于嵌入式SQL DML)。MAC例程(对于嵌入式SQL DML)。Last Compile Time:例程的上次编译时间或准备时间。如果SQL语句解冻,重新编译MAC例程会同时更新此时间戳和Plan时间戳。如果SQL语句已冻结,则重新编译MAC例程仅更新此时间戳;在您解冻计划之前,Plan时间戳不会更改;然后Plan时间戳将显示计划解冻的时间。语句使用以下关系部分列出了一个或多个用于创建查询计划的定义表。对于使用查询从另一个表提取值的INSERT,或者使用FROM子句引用另一个表的UPDATE或DELETE,这两个表都在此处列出。每个表都列出了下列值:
Table or View Name:表或视图的限定名称。Type:表或视图。Last Compile Time:表(持久化类)上次编译的时间。Classname:与表关联的类名。本节包括用于重新编译类的编译类选项。如果重新编译解冻计划,则所有三个时间字段都会更新。如果重新编译冻结的计划,则会更新两个上次编译时间字段,但不会更新计划时间戳。解冻计划并单击刷新页面按钮后,计划时间戳将更新为计划解冻的时间。
可以使用SQLTableStatements()存储查询返回指定表的SQL语句。下面的示例显示了这一点:
/// w ##class(PHA.TEST.SQL).SQLTableStatements()
ClassMethod SQLTableStatements()
{
SET mycall = "CALL %Library.SQLTableStatements('Sample','Person')"
SET tStatement = ##class(%SQL.Statement).%New()
SET qStatus=tStatement.%Prepare(mycall)
IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
SET rset=tStatement.%Execute()
IF rset.%SQLCODE '= 0 {WRITE "SQL error=",rset.%SQLCODE QUIT}
DO rset.%Display()
}DHC-APP>w ##class(PHA.TEST.SQL).SQLTableStatements()
Dumping result #1
SCHEMA RELATION_NAME PLAN_STATE LOCATION STATEMENT
SAMPLE PERSON 0 %sqlcq.DHCdAPP.cls228.1 DECLARE C CURSOR FOR SELECT * INTO :%col(1) , :%col(2) , :%col(3) , :%col(4) , :%col(5) , :%col(6) , :%col(7) , :%col(8) , :%col(9) , :%col(10) , :%col(11) , :%col(12) , :%col(13) , :%col(14) , :%col(15) FROM SAMPLE . PERSON
SAMPLE PERSON 0 Sample.Person.1 SELECT AGE , DOB , FAVORITECOLORS , HOME , NAME , OFFICE , SSN , SPOUSE , X__CLASSNAME , HOME_CITY , HOME_STATE , HOME_STREET , HOME_ZIP , OFFICE_CITY , OFFICE_STATE , OFFICE_STREET , OFFICE_ZIP INTO :%e ( ) FROM %IGNOREINDEX * SAMPLE . PERSON WHERE ID = :%rowid
...
CURSOR FOR SELECT P . NAME , P . AGE , E . NAME , E . AGE FROM %ALLINDEX SAMPLE . PERSON AS P LEFT OUTER JOIN SAMPLE . EMPLOYEE AS E ON P . NAME = E . NAME WHERE P . AGE > 21 AND %NOINDEX E . AGE < 65
SAMPLE PERSON 0 PHA.TEST.SQL.1 SELECT NAME , SPOUSE INTO :name , :spouse FROM SAMPLE . PERSON WHERE SPOUSE IS NULL
SAMPLE PERSON 0 PHA.TEST.ObjectScript.1 SELECT NAME , DOB , HOME INTO :n , :d , :h FROM SAMPLE . PERSON
70 Rows(s) Affected可以使用INFORMATION_SCHEMA包表来查询SQL语句列表。InterSystems IRIS支持以下类:
INFORMATION_SCHEMA.STATEMENTS:包含当前名称空间中的当前用户可以访问的SQL语句索引项。INFORMATION_SCHEMA.STATEMENT_LOCATIONS:包含调用SQL语句的每个例程位置:持久类名或缓存查询名。INFORMATION_SCHEMA.STATEMENT_RELATIONS:包含SQL语句使用的每个表或视图条目。本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。