`
isiqi
  • 浏览: 16488898 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

SQL 语言执行效率经验谈

阅读更多

SQL语句中,IN、EXISTS、NOT IN、NOT EXISTS的效率较低,尤其是后两种语句,当数据量较大时,更常给人一种死机般的感觉。本文提供一种使用连接的方法代替以上的四种语句,可大副提高SQL语句的运行效率。以NOT IN为例,当数据量达到一万时,效率可提高20倍,数据量越大,效率提高的幅度也就越大。

本文所举的例子在Oracle 7.0下运行通过,但本文所推荐的方法在各种大型数据库上皆适用。
为了能够更好的说明问题,我们采用示例的方式来说明问题。下面,我们将创建一些数据库表和数据,用于在举例时使用。

下面的语句将创建我们示例中将使用的表,并分别在表1(TAB1)中存入10000条数据,表2(TAB2)中存入5000条数据。

SQL语句如下:

CREATE TABLE TAB1
(
COL1 VARCHAR(20) NOT NULL,
COL2 INTEGER,
PRIMARY KEY(COL1)
);
CREATE TABLE TAB2
(
COL1 VARCHAR(20) NOT NULL,
PRIMARY KEY(COL1)
);
CREATE TABLE TAB3
(
COL1 VARCHAR(20) NOT NULL,
PRIMARY KEY(COL1)
);
CREATE OR REPLACE TRIGGER T_TAB3 BEFORE INSERT ON TAB3 FOR EACH ROW
DECLARE
NUM1 NUMBER;
BEGIN
NUM1:=1;
LOOP
EXIT WHEN NUM1>10000;
INSERT INTO TAB1 VALUES (NUM1,NUM1);
IF NUM1<=5000 THEN INSERT INTO TAB2 VALUES (NUM1);
END IF;
NUM1:=NUM1+1;
END LOOP;
END;
INSERT INTO TAB3 VALUES('1');

下面,我们将举2个例子来具体说明使用连接替换IN、NOT IN、EXISTS、NOT EXISTS的方法。

 读取表1中第2列(COL2)数据的总和,且其第1列数据存在于表2的第1列中。

1. 使用IN的SQL语句:

SELECT SUM(COL2) FROM TAB1 WHERE COL1 IN(SELECT COL1 FROM TAB2)

2. 使用EXISTS的SQL语句:

SELECT SUM(COL2) FROM TAB1 WHERE EXISTS(SELECT * FROM TAB2 WHERE TAB1.COL1=TAB2.COL1)

3. 使用连接的SQL语句:

SELECT SUM(A.COL2) FROM TAB1 A,TAB2 B

WHERE A.COL1=B.COL1

 读取表1中第2列(COL2)数据的总和,且其第1列数据不存在于表2的第1列中。


1. 使用NOT IN的SQL语句:

SELECT SUM(COL2) FROM TAB1 WHERE COL1 NOT IN(SELECT COL1 FROM TAB2)

2. 使用NOT EXISTS的SQL语句:

SELECT SUM(COL2) FROM TAB1 WHERE NOT EXISTS(SELECT * FROM TAB2 WHERE
TAB1.COL1=TAB2.COL1)

3. 使用外连接的SQL语句:

SELECT SUM(A.COL2) FROM TAB1 A,TAB2 B WHERE A.COL1=B.COL1(+) AND B.COL1 IS NULL

下面介绍IN、NOT IN、EXIST、NOT EXIST在DELETE和UPDATE语句中的效率提高方法。

下面所举的例子在Microsoft SQL Server 7.0下运行通过,但所推荐的方法在各种大型数据库上皆适用。下面,我们将创建一些数据库表和数据,用于举例说明。我们将分别在表A(TA)中存入 10000条数据,表B(TB)中存入5000条数据。

SQL语句如下:

CREATE TABLE TA
(
CA INT
)
CREATE TABLE TB
(
CA INT
)
CREATE TABLE TC
(
CA INT
)
CREATE TRIGGER TRA ON TC
FOR INSERT
AS
DECLARE @MINT INT
BEGIN
SELECT @MINT=1
WHILE (@MINT<=5000)
BEGIN
INSERT INTO TA VALUES(@MINT)
INSERT INTO TB VALUES(@MINT)
SELECT @MINT=@MINT+1
END
WHILE (@MINT<=10000)
BEGIN
INSERT INTO TA VALUES(@MINT)
SELECT @MINT=@MINT+1
END
END
GO
INSERT INTO TC VALUES(1)
GO

 删除表A中表A和表B相同的数据

1. 用IN的SQL语句:
DELETE FROM TA WHERE TA.CA IN (SELECT CA FROM TB)

2. 用EXISTS的SQL语句:
DELETE FROM TA WHERE EXISTS (SELECT * FROM TB WHERE TB.CA=TA.CA)

3. 使用连接的SQL语句:
DELETE TA FROM TA,TB WHERE TA.CA=TB.CA

 删除表A中表A存在但表B中不存在的数据

1. 使用IN的SQL语句:
DELETE FROM TA WHERE TA.CA NOT IN (SELECT CA FROM TB)

2. 使用EXISTS的SQL语句:
DELETE FROM TA WHERE NOT EXISTS (SELECT CA FROM TB WHERE TB.CA=TA.CA)

3. 使用连接的SQL语句:
DELETE TA FROM TA LEFT OUTER JOIN TB ON TA.CA=TB.CA WHERE TB.CA IS NULL


 更新表A中表A和表B相同的数据
1. 使用IN的SQL语句:
UPDATE TA SET CA=CA+10000 WHERE CA IN (SELECT CA FROM TB)

2. 使用EXISTS的SQL语句:
UPDATE TA SET CA=CA+10000 WHERE EXISTS (SELECT CA FROM TB WHERE TB.CA=TA.CA)

3. 使用连接的SQL语句:
UPDATE TA SET TA.CA=TA.CA+10000 FROM TA,TB WHERE TA.CA=TB.CA


 更新表A中表A存在但表B中不存在的数据

1. 使用IN的SQL语句:
UPDATE TA SET CA=CA+10000 WHERE CA NOT IN (SELECT CA FROM TB)

2. 使用EXISTS的SQL语句:
UPDATE TA SET CA=CA+10000 WHERE NOT EXISTS (SELECT CA FROM TB WHERE TB.CA=TA.CA)

3. 使用连接的SQL语句:
UPDATE TA SET TA.CA=TA.CA+10000 FROM TA LEFT OUTER JOIN TB ON TA.CA=TB.CA WHERE TB.CA IS NULL
分享到:
评论

相关推荐

    sql2005一些个人体会之谈

    首先,SQL Server 2005引入了许多新特性,例如增强的T-SQL语言,使得数据库编程更加灵活高效。其中,游标性能的提升,允许开发者更精确地控制数据处理流程;而新加入的Common Table Expressions(CTE)则为复杂的...

    powerbuilder编程经验谈

    7. **源代码管理**:在“powerbuilder编程经验谈”中,丰富的源代码资源意味着可以学习到实际项目中的编码实践。通过研究这些代码,你可以了解最佳编程实践,例如代码组织、命名规范和注释技巧。 8. **软件工程原则...

    powerbuilder编程经验谈.

    PB编程经验谈涵盖了从基础到高级的各种技巧和最佳实践,旨在帮助开发者提升效率,创建稳定且功能丰富的应用程序。 1. **PowerBuilder基础** - **语法与结构**:PB使用类似SQL的语法,使得数据库操作直观易懂。它...

    浅谈SQL重构在铁路工务信息PWMIS软件中的应用.pdf

    2. **存储过程与函数优化**:在PWMIS软件中,可能包含大量存储过程和函数,这些预编译的SQL代码能提高执行效率,但也可能成为性能瓶颈。优化存储过程,减少不必要的数据处理和传输,可以提升系统响应速度。 3. **...

    PowerBuilder编程经验谈

    本主题主要围绕"PowerBuilder编程经验谈"展开,旨在分享关于PowerBuilder的编程技巧和实践经验。 1. **PowerBuilder简介**:PowerBuilder是由Sybase公司(现被SAP收购)开发的一款可视化的面向对象的集成开发环境...

    数据库设计经验谈.pdf

    - **参数化查询**:减少SQL注入风险,提高执行效率。 - **事务管理**:确保数据操作的一致性和完整性。 **3. 性能调优** - **索引优化**:定期审查和调整索引结构。 - **查询优化**:分析慢查询日志,优化查询语句...

    浅谈PL_SQL在Web中的应用 (1).pdf

    PL/SQL是Oracle数据库的一种高级编程语言,它结合了SQL的查询功能和过程性编程语言的控制结构。在Web应用程序中,PL/SQL可以作为一个强大的工具,用于处理和管理数据库,从而实现动态网页内容的生成。本文将深入探讨...

    OA项目实施经验谈.doc

    【OA项目实施经验谈】 OA(Office Automation)项目实施是一个涉及企业管理、信息技术和用户操作习惯融合的过程。在本文中,作者结合自身作为软件实施工程师的经验,分享了实施OA项目的关键步骤和注意事项,以帮助...

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

    他认为对于SQL的学习是永无止境的,相信每一个查询Oracle数据库的人都需要精通SQL语言,才能写出高效的查询。他参与本书的编写就是为了帮助别人实现这一目标。 目录 封面 -11 封底 -10 扉页 -9 版权 -8 版权声明 -7...

    hive与hbase整合经验谈

    Hive是Apache软件基金会开发的一个数据仓库系统,它提供了一种SQL-like的语言(HQL)来查询存储在Hadoop文件系统(HDFS)上的大量数据。Hive的优点在于其易用性,可以方便地将结构化的数据文件映射为一张数据库表,...

    PostgreSQL+经验谈(德哥)-PostgreSQL2012-p72

    3. **函数语言**:PostgreSQL支持多种函数编写语言,包括C、SQL、PL/pgSQL、PL/Perl、PL/Tcl和PL/Python等,这使得用户可以根据需求选择最适合的语言来编写复杂的业务逻辑。 4. **游标**:PostgreSQL的游标支持滚动...

    浅谈Java语言评价胜出的8大技术优势

    ### 浅谈Java语言评价胜出的8大技术优势 #### 1. 强大的API支持 Java提供了非常丰富的API支持,包括网络编程中的Socket API、数据库操作中的SQL API、图形用户界面的Swing和AWT API等。这些API不仅功能强大而且...

    数据库设计经验谈(一个成功的管理系统,是由:[50% 的业务 + 50% 的软件] 所组成,而 50% 的成功软件又有 [25% 的数据库 + 25% 的程序] 所组成,数据库设计的好坏是一个关键)

    ### 数据库设计经验谈 #### 一、设计数据库之前的准备 **考察现有环境** 在启动新的数据库项目之前,深入分析当前的业务环境和技术基础是非常重要的。这不仅涉及到对业务需求的理解,还包括对现有系统的评估。...

    Java项目经理的面试经验之谈.docx

    - **数据库管理**:掌握SQL语言,了解关系型数据库如MySQL、Oracle的使用。 - **分布式系统**:理解微服务架构、负载均衡、分布式缓存等概念。 - **版本控制**:熟悉Git,懂得如何进行版本管理和协同开发。 3. *...

    Struts+Hibernate谈J2EE的数据表示.rar

    Hibernate通过XML配置文件(hibernate.cfg.xml)和注解来定义对象与数据库表的映射关系,提供了强大的查询语言HQL(Hibernate Query Language)和Criteria API,简化了数据操作。 当Struts与Hibernate结合使用时,...

    浅谈ADO.NET数据库脚本

    存储过程的好处包括减少网络流量、提高执行效率和保证操作的安全性。 知识点七:***操作数据库 在描述中作者提到,他不想总是直接使用SQL文本形式操作数据库,因此选择了***作为解决方案。在.NET环境中,***提供了...

    二十三种设计模式【PDF版】

    GoF 的《设计模式》是所有面向对象语言(C++ Java C#)的基础,只不过不同的语言将之实现得更方便地使用。 GOF 的设计模式是一座"桥" 就 Java 语言体系来说,GOF 的设计模式是 Java 基础知识和 J2EE 框架知识之间一...

Global site tag (gtag.js) - Google Analytics