0 0

为什么是全表扫描,索引没起作用,Oracle 11g 递归子句10

为什么是全表扫描,索引没起作用,Oracle 11g 递归子句


人员表 person 不到2万条记录
单位表 dept   1千多

语句目的是查询1单位下所有单位的人的个数

select deptid,deptname,(select count(1) from person p
where p.deptid in (
select t.deptid from dept t Start With t.deptid = d.deptid
Connect By Prior t.deptid=t.parentid)
from dept d where d.parentid='1'

这个时候person表上deptid索引没有起作用,是全表扫描!!
查询时间为114秒!!!

如果执行
select deptid,deptname,(select count(1) from person p
where p.deptid in (
select t.deptid from dept t Start With t.deptid = '1'
Connect By Prior t.deptid=t.parentid)
from dept d where d.deptid='1'
这个速度是非常快的 0.03秒大概

请求大神们,帮忙解决!
2013年1月23日 12:35

7个答案 按时间排序 按投票排序

0 0

先获取执行计划
然后根据执行计划分析sql目前是怎么执行的。(应该是全表扫描)
想办法把全表扫描改成索引扫描。(例如:追加索引,追加注释来指定该要使用的索引)

遇到这样的问题一般都是具体问题具体分析。

2013年1月24日 13:24
0 0

1、sql应该改一改 直接如下,把需要的字段直接放上
select t.deptid from dept t  Start With t.deptid='1'
Connect By Prior t.deptid=t.parentid

2013年1月24日 07:59
0 0

我觉得你的SQL应该改写下.
第一步用SYS_CONNECT_BY_PATH把父机构id为1的 机构树的路径弄出来 , 在此基础上通过substr只取根的deptid
select deptid,deptname,REGEXP_SUBSTR(SYS_CONNECT_BY_PATH(deptid,'.'),'[^.]+',1,1) as rootdept
from dept start with parentid='1' connect by prior deptid = parentid

第二步和person表做关联,后按照rootdept作group by
select d.rootdept, count(p.id) from person p ,(select deptid,deptname,REGEXP_SUBSTR(SYS_CONNECT_BY_PATH(deptid,'.'),'[^.]+',1,1) as rootdept
from dept start with parentid='1' connect by prior deptid = parentid) d
where p.deptid = d.deptid group by d.rootdept

手头上没有环境,不知道写得对不对,大概思路就是这样的.

2013年1月23日 19:24
0 0

可以在sql语句中强制走索引

2013年1月23日 18:14
0 0

parentid 上面有索引吗?

2013年1月23日 16:10
0 0

笛卡尔积?

2013年1月23日 15:08
0 0

看看解释计划吧

2013年1月23日 14:17

相关推荐

    Oracle中的树状查询(递归查询)

    - 使用`HOLDING JOIN`和`START WITH`结合可以避免全表扫描,提高查询效率。 - `CONNECT_BY_ROOT`函数用于获取树的根节点值,简化结果处理。 - `LEVEL`伪列提供当前节点在树中的深度,有助于分层显示和限制查询...

    oracle 性能优化 加快查询效率

    3. **函数转换与前模糊查询**:对字段进行函数转换或前模糊查询通常会导致索引失效,从而进行全表扫描。 #### 五、索引管理 - **主键索引的合理使用**:对于记录数较少的表,只需要保留主键索引即可,过多的索引...

    oracle的sql优化

    Oracle通过RowID高效访问数据,但如果执行函数操作或进行前导模糊搜索,可能使索引失效,导致全表扫描。 - 在编写SQL时,确保大小写一致,以利于Oracle共享池和缓冲区中的SQL匹配。 2. **查询顺序**: - Oracle...

    树状数据库表:Oracle中start with...connect by prior子句用法

    为了优化查询,可以创建索引在`PARENT_DEPARTMENT_ID`字段,减少全表扫描的可能性。 总结来说,`START WITH...CONNECT BY PRIOR`子句是Oracle SQL处理树形数据的关键工具,通过它可以有效地查询和展示层次关系的...

    Oracle执行计划分析

    全表扫描是指数据库读取表中的所有行,并检查每行是否满足WHERE子句中的条件。在全表扫描中,可以使用多块读操作(由db_block_multiblock_read_count参数控制)一次性读取多个数据块,以减少I/O操作次数。全表扫描...

    oracle执行计划解释

    1. **全表扫描(Full Table Scan,FTS)**:当WHERE子句的过滤条件不足以利用索引时,Oracle可能会选择全表扫描,逐行检查所有数据。这种存取方法适用于数据量不大或预计返回数据占总数据比例较高的场景。为了提高全...

    ORACLE执行计划和SQL调优

    - **全表扫描(Full Table Scans, FTS)**:遍历整个表来获取数据,当没有可用索引或者全表扫描更高效时使用。 - **通过ROWID的表存取(Table Access by ROWID)**:直接根据ROWID定位数据行,非常快速,但只适用...

    McGraw-Hill Osborne Oracle Database 10g SQL.rar

    7. SQL优化:讨论如何通过优化SQL查询来提高数据库性能,包括分析执行计划、使用绑定变量、避免全表扫描、合理使用索引等策略。 8. 安全性与权限管理:介绍Oracle的用户管理、角色分配、权限控制以及审计功能,确保...

    ORACLE执行计划和SQL调优.pptx

    SQL调优的目标是减少全表扫描,优化索引使用,以及明智地选择Driving Table和Probed Table,以最小化I/O操作和提高查询速度。理解并熟练运用这些概念对于数据库管理员和开发人员来说至关重要,因为它们直接影响到...

    oracle 使用递归的性能提示测试对比

    3. **避免全表扫描**:如果可能,尽量避免在`WHERE`子句中使用全表扫描。 4. **使用适当的连接类型**:根据数据分布情况,选择合适的连接类型(如内连接、外连接)。 5. **使用`NOCYCLE`防止无限递归**:防止因数据...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    3.2.7 索引快速全扫描 79 3.3 联结方法 80 3.3.1 嵌套循环联结 81 3.3.2 排序-合并联结 83 3.3.3 散列联结 84 3.3.4 笛卡儿联结 87 3.3.5 外联结 88 3.4 小结 94 第4章 SQL是关于集合的 95 4.1 以面向集合...

    java就业数据库面试题[001].pdf

    - 分析和调整查询语句,避免全表扫描和无效的索引使用。 - 使用存储过程封装复杂操作,减少网络传输开销。 - 监控和调整数据库配置,确保资源合理分配。 - 定期维护数据库,包括清理无用数据、重建索引和统计...

    JAVA经典面试题.docx

    访问表的方式包括全表扫描和基于ROWID的访问,后者通过索引能更高效地定位数据。编写高效的SQL语句应注意表连接顺序、WHERE子句的解析顺序、避免使用'*'通配符以减少解析时间,尽量减少数据库访问次数,整合无关联的...

    oracl学习资料下载

    查询优化主要通过编写高效的SQL语句,减少全表扫描,利用EXPLAIN PLAN分析执行计划来实现;表分区是将大表分成逻辑上独立的部分,以提高查询速度和管理效率;存储优化包括选择合适的存储参数,如块大小、缓存设置等...

    SQL语法与帮助

    =、、IN(不是一个常量列表)和OR操作符,因为这些通常会导致全表扫描或无法使用索引。 3. 减少子查询:尽量将子查询转化为连接查询,或者利用临时表和存储过程优化。 4. 适当使用JOIN:避免使用不必要的JOIN,优化...

    Oracle9i的init.ora参数中文说明

    则需要进行全表扫描, 以便将数据按照所定义的语言排序进行整理。 值范围: BINARY 或有效的语言定义名。 默认值: 从 NLS_LANGUAGE 中获得 nls_territory: 说明: 为以下各项指定命名约定, 包括日期和星期的编号, ...

    通过分析SQL语句的执行计划优化SQL

    利用ROWID可以避免全表扫描,大大加快查询速度。 4. **递归SQL**: 递归SQL是指那些在执行过程中可能调用自身或其他SQL语句的查询。正确处理递归SQL可以避免不必要的重复计算,提高查询效率。 5. **Rowsource和...

Global site tag (gtag.js) - Google Analytics