设为首页 收藏本站
查看: 438|回复: 0

[经验分享] SQL 语言执行效率经验谈

[复制链接]

尚未签到

发表于 2016-11-12 07:07:49 | 显示全部楼层 |阅读模式
http://www.croot.com/imges/t_gsdt_b2.gif  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的方法。

http://www.croot.com/imges/jt.gif 读取表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

http://www.croot.com/imges/jt.gif 读取表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
http://www.croot.com/imges/jt.gif 删除表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

http://www.croot.com/imges/jt.gif 删除表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


http://www.croot.com/imges/jt.gif 更新表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


http://www.croot.com/imges/jt.gif 更新表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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-299046-1-1.html 上篇帖子: net sql连接字符串详解 下篇帖子: sql server2005 触发器例子
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表