首页 > 数据库 >[20231114]如何知道一条sql语句涉及到那些表.txt

[20231114]如何知道一条sql语句涉及到那些表.txt

时间:2023-11-16 21:33:18浏览次数:53  
标签:20231114 name SYS book sql ---------- TABLE txt id

[20231114]如何知道一条sql语句涉及到那些表.txt

--//别人问的问题,开始想看执行计划不就可以吗?当然一些计划可能仅仅涉及到索引。还有join elimination可能仅仅看到1个表。
--//对方的目的就是获取这条sql语句相关表,重新分析表看看。

--//我想起查询表获得对应sql_id的脚本,脚本如下,参数5,6对应owner,table_namne.

SELECT /*+ MATERIALIZE ordered use_hash(d) use_hash(c) */
        DISTINCT c.kglobt03 sql_id
   FROM sys.x$kglob o
       ,sys.x$kgldp d
       ,sys.x$kglcursor c
  WHERE     o.inst_id = USERENV ('Instance')
        AND d.inst_id = USERENV ('Instance')
        AND c.inst_id = USERENV ('Instance')
        AND o.kglnaown = upper(nvl('&5',user))
        AND o.kglnaobj = upper('&6')
        AND d.kglrfhdl = o.kglhdadr
        AND c.kglhdadr = d.kglhdadr;

--//按照该脚本修改一下就可以实现该功能。

$ cat sqlt.sql
column owner format a20
column table_name format a30
column ot format a50

with sqla as ( SELECT /*+ MATERIALIZE leading(c d o ) use_nl(d) use_nl(o) */
        DISTINCT o.kglnaown owner, o.kglnaobj table_name
   FROM sys.x$kglob o
       ,sys.x$kgldp d
       ,sys.x$kglcursor c
  WHERE     o.inst_id = USERENV ('Instance')
        AND d.inst_id = USERENV ('Instance')
        AND c.inst_id = USERENV ('Instance')
        AND d.inst_id=o.inst_id
        AND c.inst_id=d.inst_id
        and c.kglobt03 = '&1'
        AND d.kglrfhdl = o.kglhdadr
        AND c.kglhdadr = d.kglhdadr)
select owner,table_name,owner||'.'||table_name ot from dba_tables where (owner,table_name) in (select * from sqla);

--//验证看看:

1.环境:
SCOTT@book> @ver1
PORT_STRING         VERSION    BANNER
------------------- ---------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

2.测试1:
SCOTT@book> select emp.* from emp,dept where emp.deptno=dept.deptno and empno=7369;
     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20
--//多执行几次.执行计划如下:

Plan hash value: 2949544139
---------------------------------------------------------------------------------------
| Id  | Operation                   | Name   | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |        |        |       |     1 (100)|          |
|*  1 |  TABLE ACCESS BY INDEX ROWID| EMP    |      1 |    38 |     1   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN         | PK_EMP |      1 |       |     0   (0)|          |
---------------------------------------------------------------------------------------
--//由于join elimination原因,仅仅看到使用emp的pk_emp索引.

SCOTT@book> @ hash
HASH_VALUE SQL_ID        CHILD_NUMBER KGL_BUCKET PLAN_HASH_VALUE HASH_HEX   SQL_EXEC_START      SQL_EXEC_ID
---------- ------------- ------------ ---------- --------------- ---------- ------------------- -----------
3279263698 6a0as8b1rb5yk            0     104402      2949544139  c37597d2  2023-11-14 09:16:09    16777218

SYS@book> @ sqlt 6a0as8b1rb5yk
OWNER TABLE_NAME OT
----- ---------- -----------
SCOTT DEPT       SCOTT.DEPT
SCOTT EMP        SCOTT.EMP

3.测试2:
$ cat aa.txt
SELECT   SYS.all_cons_columns.column_name, SYS.all_constraints.constraint_name
    FROM SYS.all_constraints, SYS.all_cons_columns
   WHERE SYS.all_constraints.constraint_type = 'P'
     AND SYS.all_constraints.table_name = 'EMP'
     AND SYS.all_constraints.owner = 'SCOTT'
     AND SYS.all_constraints.constraint_name = SYS.all_cons_columns.constraint_name
     AND SYS.all_constraints.table_name = SYS.all_cons_columns.table_name
     AND SYS.all_constraints.owner = SYS.all_cons_columns.owner
ORDER BY SYS.all_constraints.constraint_name, SYS.all_cons_columns.POSITION;

SCOTT@book> @ aa.txt
COLUMN_NAME CONSTRAINT_NAME
----------- ---------------
EMPNO       PK_EMP

SCOTT@book> @ hash
HASH_VALUE SQL_ID        CHILD_NUMBER KGL_BUCKET PLAN_HASH_VALUE HASH_HEX   SQL_EXEC_START      SQL_EXEC_ID
---------- ------------- ------------ ---------- --------------- ---------- ------------------- -----------
3901825224 bt65mz7n92868            0      73928      1868126782  e89120c8  2023-11-14 09:21:03    16777222

SYS@book> @ sqlt bt65mz7n92868
OWNER TABLE_NAME OT
----- ---------- ---------------
SYS   CON$       SYS.CON$
SYS   COL$       SYS.COL$
SYS   CCOL$      SYS.CCOL$
SYS   USER$      SYS.USER$
SYS   OBJ$       SYS.OBJ$
SYS   CDEF$      SYS.CDEF$
SYS   OBJAUTH$   SYS.OBJAUTH$
SYS   ATTRCOL$   SYS.ATTRCOL$
8 rows selected.

4.测试3:
SYS@book> select * from V$INDEXED_FIXED_COLUMN where table_name in ('X$KGLOB','X$KGLDP','X$KGLCURSOR');
TABLE_NAME INDEX_NUMBER COLUMN_NAME          COLUMN_POSITION
---------- ------------ -------------------- ---------------
X$KGLOB               2 KGLOBT03                           0
X$KGLOB               1 KGLNAHSH                           0
X$KGLDP               1 KGLNAHSH                           0

SYS@book> @ dpc '' '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  42c7rtyakuuc0, child number 0
-------------------------------------
select * from V$INDEXED_FIXED_COLUMN where table_name in
('X$KGLOB','X$KGLDP','X$KGLCURSOR')
Plan hash value: 2260767298
---------------------------------------------------------------------------------------------------------
| Id  | Operation         | Name    | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |  OMem |  1Mem | Used-Mem |
---------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         |        |       |     1 (100)|          |       |       |          |
|*  1 |  HASH JOIN        |         |      6 |   594 |     1 (100)| 00:00:01 |  1393K|  1393K| 1266K (0)|
|*  2 |   FIXED TABLE FULL| X$KQFCO |      6 |   414 |     1 (100)| 00:00:01 |       |       |          |
|*  3 |   FIXED TABLE FULL| X$KQFTA |     10 |   300 |     0   (0)|          |       |       |          |
---------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$5C160134
   2 - SEL$5C160134 / C@SEL$3
   3 - SEL$5C160134 / T@SEL$3
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("T"."INDX"="C"."KQFCOTAB")
   2 - filter(("KQFCOIDX"<>0 AND "C"."INST_ID"=USERENV('INSTANCE')))
   3 - filter(("KQFTANAM"='X$KGLCURSOR' OR "KQFTANAM"='X$KGLDP' OR "KQFTANAM"='X$KGLOB'))

SYS@book> @ sqlt 42c7rtyakuuc0
no rows selected
--//一些X$表查询不到.这些是一些内存结构,不是真正意义上的表.

SYS@book> select count(*) from v$session;
  COUNT(*)
----------
        27

SYS@book> @ dpc '' '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  6d3y2ug8byd5j, child number 0
-------------------------------------
select count(*) from v$session
Plan hash value: 3931255564
------------------------------------------------------------------------------------
| Id  | Operation                  | Name            | E-Rows |E-Bytes| Cost (%CPU)|
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |                 |        |       |     1 (100)|
|   1 |  SORT AGGREGATE            |                 |      1 |    91 |            |
|   2 |   NESTED LOOPS             |                 |      1 |    91 |     0   (0)|
|   3 |    NESTED LOOPS            |                 |      1 |    78 |     0   (0)|
|*  4 |     FIXED TABLE FULL       | X$KSUSE         |      1 |    52 |     0   (0)|
|*  5 |     FIXED TABLE FIXED INDEX| X$KSLWT (ind:1) |      1 |    26 |     0   (0)|
|*  6 |    FIXED TABLE FIXED INDEX | X$KSLED (ind:2) |      1 |    13 |     0   (0)|
------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$5C160134
   4 - SEL$5C160134 / S@SEL$3
   5 - SEL$5C160134 / W@SEL$3
   6 - SEL$5C160134 / E@SEL$3
Predicate Information (identified by operation id):
---------------------------------------------------
   4 - filter(("S"."INST_ID"=USERENV('INSTANCE') AND
              BITAND("S"."KSSPAFLG",1)<>0 AND BITAND("S"."KSUSEFLG",1)<>0))
   5 - filter("S"."INDX"="W"."KSLWTSID")
   6 - filter("W"."KSLWTEVT"="E"."INDX")

SYS@book> @ sqlt 6d3y2ug8byd5j
no rows selected

SYS@book> select count(*) from v$session,scott.dept;
  COUNT(*)
----------
       100

SYS@book> @ hash
HASH_VALUE SQL_ID        CHILD_NUMBER KGL_BUCKET PLAN_HASH_VALUE HASH_HEX   SQL_EXEC_START      SQL_EXEC_ID
---------- ------------- ------------ ---------- --------------- ---------- ------------------- -----------
2763321059 5n2nw9kkb9vr3            0      61155      3295531564  a4b4eee3  2023-11-16 16:05:00    16777216

SYS@book> @ sqlt 5n2nw9kkb9vr3
OWNER                TABLE_NAME                     OT
-------------------- ------------------------------ --------------------------------------------------
SCOTT                DEPT                           SCOTT.DEPT


标签:20231114,name,SYS,book,sql,----------,TABLE,txt,id
From: https://www.cnblogs.com/lfree/p/17837314.html

相关文章

  • 非常经典的一道SQL报错注入题目[极客大挑战 2019]HardSQL 1(两种解法!)
    题目环境:<br/>没错,又是我,这群该死的黑客竟然如此厉害,所以我回去爆肝SQL注入,这次,再也没有人能拿到我的flag了做了好多这个作者出的题了,看来又要上强度了判断注入类型username:adminpassword:1这里把参数password作为注入点<br/>1'<br/>单引号的字符型注入万能密码注......
  • SQL(Structured Query Language)简介和常见 SQL 命令示例
    简介SQL(StructuredQueryLanguage)是一种用于访问和操作关系型数据库的标准语言。它是一个功能强大的语言,用于执行各种数据库操作,包括检索数据、插入新记录、更新记录、删除记录、创建数据库、创建新表、设置权限以及执行存储过程和视图等。以下是SQL的一些重要方面:SQL的目的......
  • SQL(Structured Query Language)简介和常见 SQL 命令示例
    简介SQL(StructuredQueryLanguage)是一种用于访问和操作关系型数据库的标准语言。它是一个功能强大的语言,用于执行各种数据库操作,包括检索数据、插入新记录、更新记录、删除记录、创建数据库、创建新表、设置权限以及执行存储过程和视图等。以下是SQL的一些重要方面:SQL的目......
  • C#使用SqlSugar操作MySQL数据库实现简单的增删改查
    ......
  • Windows server 2012/2016安装SQL Server 2005和SP4补丁
    sqlserver2005安装包sqlserver2005SP4补丁包(非常难找,留作备用)链接:https://pan.baidu.com/s/1j5OOX-iV8gLrmSNqNLE-kg提取码:jvtr复制这段内容后打开百度网盘手机App,操作更方便哦 背景:在windowsserver2012/2016x64安装sqlserver2005的时候会提示如下错误,无法启......
  • sql server 循环 有那几种 sql实现循环
    SQL循环语句  declare@iint set@i=1 while@i<30 begin insertintotest(userid)values(@i) set@i=@i+1 end1.2.3.4.5.6.7. --------------- while条件 begin 执行操作 set@i=@i+1 end WHILE 设置重复执行SQL语句或语句块的条件。只要指定的条件......
  • Ubuntu 22.04 LTS 安装最新稳定版本nginx、mysql5.7和php7.2
    Ubuntu22.04LTS安装最新稳定版本nginx、mysql5.7和php7.2全部apt-get安装,就是快,迅速。前提是需要在有网络环境的情况下哈!!操作系统版本:Ubuntu22.04LTS一、安装最新稳定版本的nginxapt-getupdate#查看默认安装的nginx版本(默认为1.18。有点老,我们安装最新稳定版本)apt......
  • Navicat设置MySQL某用户只可访问特定数据库或表
    概述项目中需要将数据库中某些表对其他系统开放,故需设置数据库的访问权限,使得某用户只能访问指定的表。MySQL提供了相关的SQL语句,但本次使用Navicat以可视化方式进行配置。方法1、新建用户2、设置权限(1)服务器权限全不勾选(2)权限权限用于设置该用户可操作哪些数据库或表,且可设置操作......
  • 源码安装MySQL
    本文使用的Linux发行版本为AnolisOS8.864位。最后更新时间2023年11月16日本文安装的MySQL版本为8.1.0,其他版本方法类似。准备工作更新系统。yum-yupdate安装依赖。yuminstall-ygccgcc-c++cmakecmake3ncursesncurses-develbisonopensslopenssl-develg......
  • MySQL5.7双主安装
    214、215 两台服务器1.下载MySQL安装包https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.43-linux-glibc2.12-x86_64.tar.gz2.上传至服务器并解压./bin/mysqld--initialize--user=mysql--basedir=/usr/local/mysql--datadir=/data/mysql/data3.配置文件/etc/my......