v$sqltext
存储的是完整的SQL,SQL被分割
SQL>descv$sqltext
NameNull?Type
-----------------------------------------------------------------------------
ADDRESSRAW(4)---------
HASH_VALUENUMBER---------和address一起唯一标志一条sql
COMMAND_TYPENUMBER
PIECENUMBER----------分片之后的顺序编号
SQL_TEXTVARCHAR2(64)--------------注意长度
v$sqlarea---------存储的SQL和一些相关的信息,比如累计的执行次数,逻辑读,物理读等统计信息
SQL>descv$sqlarea
NameNull?Type
-----------------------------------------------------------------------------
SQL_TEXTVARCHAR2(1000)
SHARABLE_MEMNUMBER
PERSISTENT_MEMNUMBER
RUNTIME_MEMNUMBER
SORTSNUMBER
VERSION_COUNTNUMBER
LOADED_VERSIONSNUMBER
OPEN_VERSIONSNUMBER
USERS_OPENINGNUMBER
FETCHESNUMBER
EXECUTIONSNUMBER
USERS_EXECUTINGNUMBER
LOADSNUMBER
FIRST_LOAD_TIMEVARCHAR2(38)
INVALIDATIONSNUMBER
PARSE_CALLSNUMBER
DISK_READSNUMBER
BUFFER_GETSNUMBER
ROWS_PROCESSEDNUMBER
COMMAND_TYPENUMBER
OPTIMIZER_MODEVARCHAR2(25)
PARSING_USER_IDNUMBER
PARSING_SCHEMA_IDNUMBER
KEPT_VERSIONSNUMBER
ADDRESSRAW(4)
HASH_VALUENUMBER
MODULEVARCHAR2(64)
MODULE_HASHNUMBER
ACTIONVARCHAR2(64)
ACTION_HASHNUMBER
SERIALIZABLE_ABORTSNUMBER
CPU_TIMENUMBER
ELAPSED_TIMENUMBER
IS_OBSOLETEVARCHAR2(1)
CHILD_LATCHNUMBER
v$sql----------存储的是具体的SQL和执行计划相关信息,实际上,v$sqlarea可以看做v$sql根据sqltext等做了groupby之后的信息
SQL>descv$sql
NameNull?Type
-----------------------------------------------------------------------------
SQL_TEXTVARCHAR2(1000)
SHARABLE_MEMNUMBER
PERSISTENT_MEMNUMBER
RUNTIME_MEMNUMBER
SORTSNUMBER
LOADED_VERSIONSNUMBER
OPEN_VERSIONSNUMBER
USERS_OPENINGNUMBER
FETCHESNUMBER
EXECUTIONSNUMBER
USERS_EXECUTINGNUMBER
LOADSNUMBER
FIRST_LOAD_TIMEVARCHAR2(38)
INVALIDATIONSNUMBER
PARSE_CALLSNUMBER
DISK_READSNUMBER
BUFFER_GETSNUMBER
ROWS_PROCESSEDNUMBER
COMMAND_TYPENUMBER
OPTIMIZER_MODEVARCHAR2(10)
OPTIMIZER_COSTNUMBER
PARSING_USER_IDNUMBER
PARSING_SCHEMA_IDNUMBER
KEPT_VERSIONSNUMBER
ADDRESSRAW(4)
TYPE_CHK_HEAPRAW(4)
HASH_VALUENUMBER
PLAN_HASH_VALUENUMBER
CHILD_NUMBERNUMBER----------注意这个
MODULEVARCHAR2(64)
MODULE_HASHNUMBER
ACTIONVARCHAR2(64)
ACTION_HASHNUMBER
SERIALIZABLE_ABORTSNUMBER
OUTLINE_CATEGORYVARCHAR2(64)
CPU_TIMENUMBER
ELAPSED_TIMENUMBER
OUTLINE_SIDNUMBER--------------注意这里跟outline有关
CHILD_ADDRESSRAW(4)
SQLTYPENUMBER
REMOTEVARCHAR2(1)
OBJECT_STATUSVARCHAR2(19)
LITERAL_HASH_VALUENUMBER
LAST_LOAD_TIMEVARCHAR2(38)
IS_OBSOLETEVARCHAR2(1)
CHILD_LATCHNUMBER
另外注意这个
QL>descv$sql_plan
NameNull?Type
-----------------------------------------------------------------------------
ADDRESSRAW(4)
HASH_VALUENUMBER
CHILD_NUMBERNUMBER------------注意这个和v$sql里面的相同字段
OPERATIONVARCHAR2(60)
OPTIONSVARCHAR2(60)
OBJECT_NODEVARCHAR2(20)
OBJECT#NUMBER
OBJECT_OWNERVARCHAR2(30)
OBJECT_NAMEVARCHAR2(64)
OPTIMIZERVARCHAR2(40)
IDNUMBER
PARENT_IDNUMBER
DEPTHNUMBER
POSITIONNUMBER
SEARCH_COLUMNSNUMBER
COSTNUMBER
CARDINALITYNUMBER
BYTESNUMBER
OTHER_TAGVARCHAR2(70)
PARTITION_STARTVARCHAR2(10)
PARTITION_STOPVARCHAR2(10)
PARTITION_IDNUMBER
OTHERVARCHAR2(4000)
DISTRIBUTIONVARCHAR2(40)
CPU_COSTNUMBER
IO_COSTNUMBER
TEMP_SPACENUMBER
ACCESS_PREDICATESVARCHAR2(4000)
FILTER_PREDICATESVARCHAR2(4000)
实际上,看起来同样的一句SQL,往往具有不同的执行计划
如果是不同的数据库用户,那么相应的涉及的对象可能都不一样,注意v$sql中
OBJECT#NUMBER
OBJECT_OWNERVARCHAR2(30)
OBJECT_NAMEVARCHAR2(64)
OPTIMIZERVARCHAR2(40)
即使是相同的数据库用户,若session的优化模式、session级的参数等不一样,执行计划也能不同。所以即使相同的sql,也可能具有不同的执行计划!
v$sqljointov$sql_plan就代表了具体的sql的执行计划,通过下面3个字段做连接
ADDRESSRAW(4)
HASH_VALUENUMBER
CHILD_NUMBERNUMBER
而v$SQLAREA忽略了执行计划等差异,只是在形式上sql文本看起来一样!相当于做了个聚合,是多个不同执行计划的sql的聚合和累计信息
Oracle9i中v$sql、v$sqlarea、v$sqltext、v$sql_plan的联系与区别
对于同一个SQL语句,如果在不同环境下使用了不同的优化器目标的情况下,会有不同的执行计划,
这样就要求分别有一个独立的游标(即子游标)来区别出每一种情况下的不同的运行行为。
Oracle用v$sqlarea中一行保存同样语句的SQL,并用字段version_count的值来指出子游标的个
数,而在v$sql里面为每个子游标保留了一个单独的行。两个表可以通过字段address和hash_value
相互对应。例如下面例子:
SQL>selectaddress,hash_value,sql_text,version_count
2fromv$sqlareawheresql_textlike'selectvalue$fromsys.props%';
ADDRESSHASH_VALUESQL_TEXTVERSION_COUNT
-----------------------------------------------------------------------------
97F1C9C4563046721selectvalue$fromsys.props$wherename=:13
SQL>selectaddress,hash_value,child_address,child_number,sql_text
2fromv$sqlwheresql_textlike'selectvalue$fromsys.props%';
ADDRESSHASH_VALUECHILD_ADDRESSCHILD_NUMBERSQL_TEXT
-----------------------------------------------------------------------------------------
97F1C9C456304672197F1C4480selectvalue$fromsys.props$wherename=:1
97F1C9C456304672197EAD3B01selectvalue$fromsys.props$wherename=:1
97F1C9C456304672197E7EEF02selectvalue$fromsys.props$wherename=:1
如果想找出这个SQL语句的执行计划,也可以通过字段address、hash_value和child_number到v$sql_plan中查找,
v$sql_plan中是区分了不同子游标的执行计划的
SQL>selectaddress,child_number,lpad('',2*level)||operation||decode(id,0,'cost='||position)op,
2options,object_name
3fromv$sql_plantwhereaddress='97F1C9C4'andhash_value=563046721;
ADDRESSCHILD_NUMBEROPOPTIONSOBJECT_NAME
---------------------------------------------------------------------
97F1C9C42SELECTSTATEMENTcost=0
97F1C9C42TABLEACCESSFULLPROPS$
97F1C9C41SELECTSTATEMENTcost=0
97F1C9C41TABLEACCESSFULLPROPS$
97F1C9C40SELECTSTATEMENTcost=0
97F1C9C40TABLEACCESSFULLPROPS$
视图v$sqltext中没有SQL语句的相关统计信息,但是v$sqltext用多行来保存sql语句,而v$sqlarea中只能
保存sql语句的前1000个字节,所以如果sql语句大于1000个字节,就要到v$sqltext中查看完整的语句,其字
段PIECE表示每个sql的行顺序。
发表于:2006-08-28,修改于:2006-08-2815:21,已浏览145