如何知道 SQL 查询是否使用其主键或备用键访问 table?

How to know if a SQL query accesses a table using its primary or alternative key?

例如,这个查询:

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

而他的tableLIC_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
);

我想知道是否有任何命令或某种方法可以知道先前的查询是通过主键还是备用键访问 table,以及为什么。

if there is any command or some way to know if the previous query accesses the table by primary or alternative key

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

解释计划有时可能与实际执行计划不同。因此,如果您推测查询未按预期执行,您可以从 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 可以收集 table 使用情况的统计信息。