SQL语句执行效率.docx
《SQL语句执行效率.docx》由会员分享,可在线阅读,更多相关《SQL语句执行效率.docx(8页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第8页 共8页SQL语句执行效率SQL语句中,IN、EXISTS、NOT IN、NOT EXISTS的效率较低,尤其是后两种语句,当数据量较大时,更常给人一种死机般的感觉。本文提供一种使用连接的方法代替以上的四种语句,可大副提高SQL语句的运行效率。以NOT IN为例,当数据量达到一万时,效率可提高20倍,数据量越大,效率提高的幅度也就越大。1)SELECT语句中的中的效率提高方法 SQL语句如下:CREATE TABLE TAB1(COL1 VARCHAR(20) NOT NULL,COL2 INTEGER,PRIMARY K
2、EY(COL1);CREATE TABLE TAB2(COL1 VARCHAR(20) NOT NULL,PRIMARY KEY(COL1);CREATE TABLE TAB3(COL1 VARCHAR(20) NOT NULL,PRIMARY KEY(COL1);下面,我们将举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
3、)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
4、. 使用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 NULL2) DELETE语句中的效率提高方法 SQL语句如下: CREATE TABLE TA(CA INT)CREATE TABLE TB(CA INT)CREATE TABLE TC(CA IN
5、T)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语句:DE
6、LETE 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 3) UPDATE语句中的效率提高方法更新表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+1000
7、0 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
8、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=方法一、尽量使用复杂的SQL来代替简单的一堆 SQL. 同样的事务,一个复杂的SQL完成的效率高于一堆简单SQL完成的效率。有多个查询时,要善于使用JOIN。 oRs=oConn.Execute(SELECT * FROM Books) while not oRs.Eof strSQL = SELECT * FROM Authors WHERE
9、AuthorID=&oRs(AuthorID) oRs2=oConn.Execute(strSQL) Response.write oRs(Title)&oRs2(Name)&q uot;oRs.MoveNext() wend 要比下面的代码慢: strSQL=SELECT Books.Title,Authors.Name FROM Books JOIN Authors ON Authors.AuthorID=Books.AuthorID oRs=oConn.Execute(strSQL) while not oRs.Eof Response.write oRs(Title)&oRs(Name
10、)&qu ot; oRs.MoveNext() wend 方法二、尽量避免使用可更新 Recordset oRs=oConn.Execute(SELECT * FROM Authors WHERE AuthorID=17,3,3)oRs(Name)=DarkManoRs.Update()要比下面的代码慢:strSQL = UPDATE Authors SET Name=DarkMan WHERE AuthorID=17oConn.Execute strSQL方法三、更新数据库时,尽量采用批处 理更新将所有的SQL组成一个大的批处理SQL,并一次运行;这比一个一个地更新数据要有效率得多。这样也更
11、加满足你进行事务处理 的需要:strSQL=strSQL=strSQL&SET XACT_ABORT ONn;strSQL=strSQL&BEGIN TRANSACTIONn;strSQL=strSQL&INSERT INTO Orders(OrdID,CustID,OrdDat) VALUES(9999,1234,GETDATE()n;strSQL=strSQL&INSERT INTO OrderRows(OrdID,OrdRow,Item,Qty) VALUES(9999,01,G4385,5)n;strSQL=strSQL&INSERT INTO OrderRows(OrdID,OrdR
12、ow,Item,Qty) VALUES(9999,02,G4726,1)n;strSQL=strSQL&COMM99v TRANSACTIONn;strSQL=strSQL&SET XACT_ABORT OFFn;oConn.Execute(strSQL);其中,SET XACT_ABORT OFF 语句告诉SQL Server,如果下面的事务处理过程中,如果遇到错误,就取消已经完成的事务。方法四、数据库索引那些将在Where子句中出现的字段,你应该首先考虑建立索引;那些需要排序的字段,也应该在考虑之列 。在MS Access中建立索引的方法:在Access里面选择需要索引的表,点击“设计”,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SQL 语句 执行 效率
限制150内