gpt4 book ai didi

sql - 改进 Oracle 中的连接查询

转载 作者:行者123 更新时间:2023-12-01 13:40:27 25 4
gpt4 key购买 nike

我有一个需要 17 秒才能执行的查询。我已经在 FIPS、STR_DT、END_DT 上应用了索引,但仍然需要时间。关于如何提高性能有什么建议吗?

我的查询:

SELECT /*+ALL_ROWS*/ K_LF_SVA_VA.NEXTVAL VAL_REC_ID,       a.REC_ID,
b.VID,
1 VA_SEQ,
51 VA_VALUE_DATATYPE,
b.VALUE VAL_NUM,
SYSDATE CREATED_DATE,
SYSDATE UPDATED_DATE
FROM CTY_REC a JOIN FIPS_CONS b
ON a.FIPS=b.FIPS AND a.STR_DT=b.STR_DT AND a.END_DT=b.END_DT;


DESC CTY_REC;

Name Null Type
------------------- ---- -------------
REC_ID NUMBER(38)
DATA_SOURCE_DATE DATE
STR_DT DATE
END_DT DATE
VID_RECSET_ID NUMBER
VID_VALSET_ID NUMBER
FIPS VARCHAR2(255)


DESC FIPS_CONS;

Name Null Type
------------- -------- -------------
STR_DT DATE
END_DT DATE
FIPS VARCHAR2(255)
VARIABLE VARCHAR2(515)
VALUE NUMBER
VID NOT NULL NUMBER

解释计划:

Plan hash value: 919279614

--------------------------------------------------------------
| Id | Operation | Name |
--------------------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | SEQUENCE | K_VAL |
| 2 | HASH JOIN | |
| 3 | TABLE ACCESS FULL| CTY_REC |
| 4 | TABLE ACCESS FULL| FIPS_CONS |
--------------------------------------------------------------

我已经为我的查询添加了表的描述和解释计划。

最佳答案

从表面上看,如果没有关于您正在使用的序列的配置信息、每个表中的行数以及从查询中预测的总行数,您的执行计划可能是返回所有行的最有效方法。

优化器显然认为索引不会提高性能,当您优化所有行而不是第一行时,这种情况通常更有可能发生。基于索引的访问是一次单 block 和一行,因此本质上可能比基于每个 block 的多 block 完整扫描慢。

Oracle 使用的散列连接是一种非常有效的连接数据集的方法。除非哈希表太大以至于溢出到磁盘,否则总成本仅略高于对两个表的完整扫描。我们需要更详细的执行统计数据,以便能够判断哈希表是否正在溢出到磁盘,如果是,解决方案可能只是修改内存管理,而不是索引。

如果序列的缓存值非常低而记录数很高,那么调用该序列也可能会阻碍您的 SQL 执行。需要更多信息——如果您需要为每一行生成一个顺序标识符,那么您可以使用 ROWNUM。

关于sql - 改进 Oracle 中的连接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40768865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com