`
eyejava
  • 浏览: 1270593 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

两种关联update的性能对比

    博客分类:
  • DB
SQL 
阅读更多
a表只有126条记录,b表有140万记录
1.
/*card_no必须是主键*/
Update ( Select (Case a.status When '挂失' Then '004' When '卡找回' Then '000' 
When '取消用卡资格' Then '008' When '已还款' Then '000' End) status_new,
b.card_status,
(Case When a.status='取消用卡资格' Then 1 Else 0 End) increment_times, 	
b.suspend_times
From etl_daily_cardstatus a,etl_custcard b
 Where a.card_no=b.card_no) 
 Set card_status=status_new,suspend_times=nvl(suspend_times,0)+increment_times;

这样写竟然需要3秒多才能update完,a.card_no,b.card_no必须是主键,不然会报错:ora-01779:cannot modify a colum which maps to non key-preserved table

2.
Update etl_custcard b
Set (b.card_status,b.suspend_times)=
(
Select (Case a.status When '挂失' Then '004' When '卡找回' Then '000' 
When '取消用卡资格' Then '008' When '已还款' Then '000' End) status_new,
(Case When a.status='取消用卡资格' Then 1 Else 0 End) increment_times
From 
(Select * From (Select card_no,status,
dense_rank() over (partition by card_no order by seqno desc) seq From etl_daily_cardstatus )
Where seq=1 ) a Where a.card_no=b.card_no )
Where card_no In (Select a.card_no From etl_daily_cardstatus a)

因为a表card_no不是主键了,所以改成这么写,第一次执行要了0.39秒,后面执行在0.016-0.03秒之间。
第二种写法应该是 in 这个where条件起了很大的作用。
分享到:
评论
1 楼 xiaoyu0920 2007-07-20  
sad85

相关推荐

    oracle的update的五种方式

    这种方式可以同时执行更新和插入操作,但写法比较繁琐,并且最多只能两个表关联,复杂的语句用 Merge 更新法将力不从心且效率差。 四、游标更新法 游标更新法是使用游标来遍历数据并执行更新操作,语法为:`BEGIN ...

    数据开发基础知识点-2(多表关联).docx

    通过对比单表设计和多表关联设计的方式,分析这两种设计模式在实际应用中的特点,并详细讲解了在多表关联场景下如何处理数据更新、删除等问题。 #### 单表设计 **定义:** 单表设计是指在一个表中存储所有相关的...

    update 子查询使用介绍

    在数据库管理和SQL语言中,`UPDATE`语句结合子查询是一种强大的工具,用于根据特定条件修改数据。本文将深入探讨`UPDATE`子查询的使用、关联子查询与非关联子查询的区别、提示(HINT)的使用以及执行计划的查看,并...

    基于GPU异构计算的关联规则挖掘算法及增量式情况的研究和简单实现1

    【性能比较】通过比较不同算法或不同实现方式的性能,可以评估 GPU 异构计算在关联规则挖掘中的优势和局限性。 【缺陷总结】在实施过程中,可能会遇到如数据不一致性、GPU 内存限制、并行计算的同步问题等挑战,...

    ORACLE 批量更新三种方式比较

    - **对于大规模数据更新**,建议使用单条SQL语句更新或采用子查询的方式进行更新,这两种方法都具有较高的性能表现,可以根据实际需求选择合适的方案。 - **特别注意**:在选择更新策略时,还需要考虑到数据库的性能...

    SQL数据库性能优化

    在进行复杂查询时,子查询是一种常见且直观的方法,但使用连接往往能提供更好的性能。连接可以有效地减少数据库的中间处理步骤,避免创建不必要的临时表。例如: - **删除无订单客户**:使用子查询的方式可能较慢,...

    数据库结构和数据对比工具

    而数据对比工具则是一种实用的辅助工具,用于比较不同数据库之间的结构差异和数据差异,确保数据的一致性和完整性。 数据库结构主要包括以下部分: 1. 表(Table):数据库中的基本单位,由一系列行和列组成,列...

    Ibatis和Hibernate的分析比较

    在IT领域,数据库持久化是应用开发中的重要环节,Ibatis和Hibernate是两种常见的ORM(对象关系映射)框架,它们都有各自的特点和优势。本文将深入探讨这两者之间的分析比较。 首先,Hibernate是一个全面的对象关系...

    SQL触发器.doc

    SQL触发器是数据库管理系统中的一个重要概念,它是一种特殊类型的存储过程,当数据库中特定表的Insert、Update或Delete操作发生时,会自动执行。触发器的主要作用是实现数据的完整性约束,进行复杂的业务逻辑处理,...

    SQL触发器的使用方法,

    SQL触发器是数据库管理系统中的一种重要机制,它允许在特定数据操作(如INSERT、UPDATE或DELETE)发生时自动执行预定义的SQL代码。通过使用触发器,数据库管理员和开发人员可以实现复杂的业务逻辑和数据完整性规则,...

    oracle中的子查询

    - **数据对比**:当需要比较表中的数据与其他数据源(如另一个表或子查询结果)中的数据时,可以使用子查询。 - **复杂条件筛选**:子查询可以用来构建复杂的筛选条件,尤其是在处理多层逻辑关系时特别有用。 - **...

    SQL触发器实例讲解.

    SQL触发器是数据库管理系统中的一种特殊程序,它允许在特定的数据操作(如INSERT、UPDATE或DELETE)发生时自动执行预定义的逻辑。触发器的概念基于数据库的触发事件,当满足某些条件时,会自动调用并执行触发器中的...

    触发器讲解

    触发器是数据库管理系统中一种特殊类型的存储过程,它会在特定的数据操作(如INSERT、UPDATE或DELETE)发生时自动执行。在SQL Server中,触发器被用来实现数据库级别的约束,确保数据的完整性和一致性。通过使用...

    數據庫開發---mysql

    MySQL是一种广泛使用的关联式数据库管理系统(Relational Database Management System,简称RDBMS),它基于关系模型,使用结构化查询语言(SQL)作为查询和操作数据的工具。本内容主要介绍了数据库概念、数据库类型...

    学生管理系统(链表和数据库)

    本文将深入探讨如何使用两种不同的编程方式——链表和SQLite数据库来实现一个学生管理系统。 首先,让我们从链表的角度来看待学生管理系统的实现。链表是一种数据结构,它由一系列节点组成,每个节点包含学生的信息...

    数据库应用基础 触发器PPT学习教案.pptx

    触发器是一种特殊的存储过程,它会在特定的数据库事件(如INSERT、UPDATE或DELETE)发生时自动执行,无需程序员显式调用。 ### 1. 触发器的基本概念 触发器是在基表执行UPDATE、INSERT或DELETE操作时被自动调用的...

    数据库基础的学习,关系型数据库与非关系型数据库。MySQL的实验。

    根据数据模型的不同,数据库主要分为两种类型:关系型数据库(Relational Database)和非关系型数据库(NoSQL Database)。 关系型数据库基于关系理论,由表格形式的数据组成,每个表格称为一个表,表与表之间通过...

    数据库上机实验报告.docx

    SQL Server支持两种主要的认证模式:混合模式和Windows集成身份验证。混合模式允许使用Windows账户或SQL Server特定的账户进行登录,提供了灵活性和兼容性。而Windows集成身份验证则依赖于Windows操作系统进行用户...

Global site tag (gtag.js) - Google Analytics