如何知道SQL查询是否使用其主键或替代键访问表?

时间:2017-04-30 09:20:13

标签: sql oracle oracle11g oracle-sqldeveloper

例如,此查询:

SELECT 
    CLIENT, TITLE, SEASON, 
    COUNT('X') N_EPISODIOS 
FROM 
    LIC_SERIES 
GROUP BY 
    CLIENT, TITLE, SEASON;

他的表LIC_SERIES是:

CREATE TABLE lic_series
(
    client VARCHAR2(15), 
    datetime DATE,
    title VARCHAR2(100) NOT NULL, 
    season  NUMBER(3) NOT NULL,
    episode NUMBER(3) NOT NULL,

    CONSTRAINT PK_licsS 
        PRIMARY KEY (client, title, season, episode),
    CONSTRAINT 
        FK_licsS1 FOREIGN KEY (title,season) REFERENCES seasons
);

我想知道是否有任何命令或某种方式来了解上一个查询是否通过主键或替代键访问该表,以及原因。

2 个答案:

答案 0 :(得分:4)

  

如果有任何命令或某种方式知道以前的查询   通过主键或替代键访问表

是,对该查询使用EXPLAIN PLAN。生成的查询计划将能够显示索引是否已被使用以及哪一个和哪里。

EXPLAIN PLAN FOR
SELECT CLIENT,TITLE,SEASON, COUNT('X') N_EPISODIOS FROM LIC_SERIES 
GROUP BY CLIENT,TITLE,SEASON;

使用如下SQL语句查看查询计划:

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

答案 1 :(得分:2)

解释计划有时可能与实际执行计划不同。因此,如果您猜测查询未按预期执行,您可以从V $ SQL_PLAN_STATISTICS_ALL系统视图中检查实际计划,

select *
  from v$sql_plan_statistics_all
 where sql_id = 'your_query_sql_id'
可以从中获取实际执行查询的

SQL_ID select * from v$session找到您的会话并向第一个查询提供sql_id

解释计划与实际计划之间的差异经常发生在数据库使用一段时间后,Oracle可以收集表使用情况的统计信息。