<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java && C#

    要學得東西很多,但我們的時間卻不是很多!
    數據加載中……
    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

    posted on 2007-03-23 13:50 Bill111 閱讀(3620) 評論(2)  編輯  收藏

    評論

    # re: SQL執行效率 2009-01-06 15:30 路人甲

    相當糟糕~
      回復  更多評論    

    # re: SQL執行效率 2011-06-09 15:00 nc

    nc
      回復  更多評論    

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 伊人免费在线观看| 亚洲免费日韩无码系列| 最近中文字幕无免费| 亚洲黄色在线播放| 中文字幕在线免费观看| 99亚洲精品高清一二区| 最近最好最新2019中文字幕免费| 亚洲AV无码一区二区三区系列| 中文字幕在线免费观看视频| 亚洲精品少妇30p| 99精品在线免费观看| 亚洲精品中文字幕乱码影院| 很黄很色很刺激的视频免费| 亚洲综合av一区二区三区不卡| 成在人线AV无码免费| 国产成人不卡亚洲精品91| 亚洲高清成人一区二区三区| 一级有奶水毛片免费看| 亚洲国产精彩中文乱码AV| 免费h片在线观看网址最新| 最新亚洲精品国偷自产在线| 日本一区免费电影| 国产视频精品免费视频| 亚洲精品日韩专区silk| 免费无码又爽又高潮视频 | 国产一级大片免费看| 特色特黄a毛片高清免费观看| 亚洲乳大丰满中文字幕| **俄罗斯毛片免费| 亚洲aⅴ无码专区在线观看| 亚洲精品国产成人专区| 亚洲成a人无码亚洲成www牛牛| 四虎1515hm免费国产| a在线观看免费视频| 亚洲三级高清免费| 亚洲精品一级无码中文字幕| 6080午夜一级毛片免费看 | 成年女人午夜毛片免费看| 一区二区三区免费高清视频| 久久精品亚洲一区二区三区浴池| 暖暖在线日本免费中文|