【问题标题】:How to know if a SQL query accesses a table using its primary or alternative key?如何知道 SQL 查询是否使用其主键或备用键访问表?
【发布时间】:2017-04-30 09:20:13
【问题描述】:

例如,这个查询:

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
);

我想知道是否有任何命令或某种方式可以知道上一个查询是通过主键还是备用键访问表,以及为什么。

【问题讨论】:

    标签: sql oracle oracle11g oracle-sqldeveloper


    【解决方案1】:

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

    是的,对该查询使用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);
    

    【讨论】:

      【解决方案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 可以收集表使用情况的统计信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-14
        • 1970-01-01
        • 2010-12-07
        • 2014-02-05
        • 1970-01-01
        • 2012-01-03
        • 2010-10-08
        相关资源
        最近更新 更多