我是在测试环境测的,实际生产环境中oa_flow_sign表有70万条数据,可还是走的全表扫描.
select count(*)
from oa_flow_sign fs, OA_APPROVE_TASK a
where fs.task_id = a.task_id
and fs.is_valid = 'Y'
and fs.sign_status = '1';
其中OA_APPROVE_TASK表的task_id建立了unique索引。
oa_flow_sign表没有关于task_id的索引,我建立了normal索引然后关联查询,可oa_flow_sign表还是走的全表扫描,为什么呢?
问题已经解决,是因为表数据太少,增加十万条数据后走索引了。了解了下是因为oracle查询很智能,原先测试环境表里只有61条数据,所以走全表扫描会更快。
两表连接索引失效
答案:2 悬赏:40 手机版
解决时间 2021-02-14 06:59
- 提问者网友:听门外雪花风
- 2021-02-13 11:54
最佳答案
- 五星知识达人网友:woshuo
- 2021-02-13 12:11
EXISTS、IN与JOIN,都可以用来实现形如“查询A表中在(或不在)B表中的记录”的查询逻辑。在查询的两个表大小相当的情况下,3种查询方式的执行时间通常是:EXISTS<=IN<=JOINNOTEXISTS<=NOTIN<=LEFTJOIN只有当表中字段允许NULL时,NOTIN的方式最慢:NOTEXISTS<=LEFTJOIN<=NOTIN但是如果两个表中一个较小,一个较大,则子查询表大的用exists,子查询表小的用in,因为in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。而无论那个表大,用notexists都比notin要快。这是因为如果查询语句使用了notin那么内外表都进行全表扫描,没有用到索引;而notextsts的子查询依然能用到表上的索引。IN的好处是逻辑直观简单(通常是独立子查询);缺点是只能判断单字段,并且当NOTIN时效率较低,而且NULL会导致不想要的结果。EXISTS的好处是效率高,可以判断单字段和组合字段,并不受NULL的影响;缺点是逻辑稍微复杂(通常是相关子查询)。JOIN用在这种场合,往往是吃力不讨好。JOIN的用途是联接两个表,而不是判断一个表的记录是否在另一个表。
全部回答
- 1楼网友:过活
- 2021-02-13 12:30
就是正常现象,这是oracle新特性中的闪回功能。 oracle在删除表时并不是真正将表删除而是修改一个名字而已,然后可以用闪回命令来还原被删除的表。 具体查看oracle闪回的相关文章。这里我就不详细解释了!
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯