如何知道 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 使用情况的统计信息。
例如,这个查询:
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 使用情况的统计信息。