这两天在写一个sql,就是有A,B两个表,要利用b表的字段更新a表对应的字段。形如
update A set A.a=(select B.b from B where A.id=B.id);
这是一个非常常见的更新查询,但是在实际使用中,我要更新的a表和b表并不是主键相关,而是一个非唯一键相等,这样在实际中,观察执行计划发现根本不走索引,尽管我在A和B的相关字段上都添加了索引,甚至使用了
hint-/*+ index()*/ ,但是依然无效,在25w大小的数据量面前,两个全表查询连接完全无法接受。
update /*+ index(t INDEX_FLAG) */ t_download_temp t set t.status= (select /*+ index (t1 INDEX_URL_TEMP)*/ t1.url from t_download_temp t1 where t1.url=t.referer) where t.flag=1 and t.status=0
后来经过思考我采用了如下方案得到了较好的效果
truncate table t_download_temp2;
insert into t_download_temp2 select t.id mid,max(t1.referer) rurl,max(t1.id) rid,max(t1.status) rstatus from t_download_temp t ,t_download_temp t1 where t.referer_ref=t1.url and t.flag=1 and t.status=0 group by t.id;
实质就是先做select * from A,B where A.c=B.c(非主键)
然后insert到一个临时表,其中在临时表中存入A的主键,并对临时表设置主键。
update (select t1.*,t2.* from t_download_temp t1,t_download_temp2 t2 where t1.id=t2.id)
set status=rstatus ,refererid=rid,referer_ref=RURL;
然后采用oracle中主键相等可以采用的一种更新方式如上,这样总运行时间只花掉了4s左右,对比之前的sql
4分钟没有跑出结果,速度完全可以接受
分享到:
相关推荐
以下是关于Oracle分区索引失效和重建的一些关键知识点: 1. **分区表的创建**: 在示例中,创建了一个名为`T_PART`的分区表,根据`OBJECT_ID`字段的值范围进行分区。`PARTITION BY RANGE`语句定义了不同分区的边界...
导致索引失效: 1、表上频繁发生update,delete操作; 2、表上发生了alter table ..move操作(move操作导致了rowid变化)。
1. `TRUNCATE PARTITION`会使全局索引失效,而`TRUNCATE`普通表不影响索引。 2. `RENAME`表不影响索引,因ROWID不变。 总结: 1. 判断是否重建索引,可通过`ANALYZE INDEX`和`index_stats`表进行评估。 2. 重建索引...
**原则三:** 避免在索引列上使用`IS NULL`和`IS NOT NULL`操作,因为这些操作会导致索引失效。当索引列允许NULL值时,ORACLE在处理`IS NULL`或`IS NOT NULL`时无法有效地利用索引。更高效的做法是使用比较运算符,...
7. **隐式类型转换**:当索引列的类型与查询条件中的类型不符时,会发生隐式类型转换,这会导致索引失效。例如,字符串类型的列与整数比较时,应确保类型匹配,或创建正确的函数索引。 8. **部分索引匹配**:使用...
- **避免通配符%的不当使用**:在索引列上使用前导通配符(如'%abc')可能导致索引失效。 - **类型转换**:尽管Oracle可以自动进行类型转换,但最好避免在索引列上直接进行不同数据类型的比较,以防止不必要的类型...
同时,检查和优化索引的使用是提升查询速度的关键,包括合理利用索引避免全表扫描,以及避免索引失效的情况,如数据类型隐形转换、列上的数学运算、不等于运算、substr函数、'%'通配符的不当使用以及字符串连接。...
- **问题**:使用OR连接多个条件可能导致索引失效。 - **解决方案**:使用UNION ALL替代,如: ```sql SELECT id FROM table WHERE num = 10 UNION ALL SELECT id FROM table WHERE num = 20; ``` **1.5 谨慎...
- 在索引列上使用表达式会导致索引失效,例如 `SELECT * FROM b WHERE b1 / 30 ;` 这种写法是不正确的。 - 使用IN、OR、LIKE、!=等操作符也可能导致索引无法正常工作,应尽量避免。 - 在使用复合索引进行查询时,...
- 避免索引失效:DML操作(INSERT、UPDATE、DELETE)可能导致索引失效,及时REBUILD索引保持其有效性。 5. **查询语句优化**: - 减少全表扫描:尽量避免无谓的全表扫描,利用索引或分区策略。 - 使用绑定变量:...
选择合适的索引类型,创建覆盖索引,避免索引失效(如在WHERE子句中使用非前导列)都是优化策略的一部分。 七、视图与物质化视图 视图是虚拟表,基于一个或多个表的查询结果。物质化视图则是视图的物理副本,可以...
8. **索引与查询性能**:索引不总是能提高查询性能,如果查询不使用索引或索引失效,可能反而导致性能下降。正确选择和设计索引是关键。 9. **绑定变量**:绑定变量避免了SQL的硬解析,减少CPU消耗和Shared Pool的...
2. 表空间(Tablespace):是Oracle存储数据的逻辑单位,由一个或多个数据文件组成。每个表、索引等对象都存在于特定的表空间中。 3. 表(Table):存储数据的基本单元,由列和行组成,每个列都有特定的数据类型。 ...
- 注意避免索引失效,如在UPDATE或INSERT操作后及时更新索引,防止索引碎片化。 2. SQL优化: - 选择正确的JOIN类型:内连接(INNER JOIN)、外连接(LEFT JOIN, RIGHT JOIN)等,根据实际需求选择最高效的JOIN...
第三章 表及索引的定义操作 94 §3.1 建立表结构 94 §3.1.1 建立表结构命令 94 §3.1.2 建立表结构例子 96 §3.1.3 建立临时表结构 97 §3.3 修改表结构 98 §3.3.1 修改表结构命令 98 §3.3.2 修改表结构例子 99 ...
在编写SQL语句时,可能会出现隐式类型转换导致索引失效的情况。例如,当查询条件使用了`trunc()`或`to_char()`函数时,即使已经创建了针对原始列的索引,也可能无法被利用。为了解决这个问题,可以考虑创建基于函数...
在Oracle数据库管理中,了解如何查询表是否被锁定以及如何执行解锁操作是至关重要的技能,尤其是在处理并发事务、性能调优或解决死锁问题时。本文将深入探讨Oracle中的表锁机制,包括如何识别锁定的表,理解不同类型...