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

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

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

    隨筆 - 6  文章 - 129  trackbacks - 0
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(14)

    隨筆檔案(6)

    文章分類(467)

    文章檔案(423)

    相冊

    收藏夾(18)

    JAVA

    搜索

    •  

    積分與排名

    • 積分 - 825594
    • 排名 - 49

    最新評論

    閱讀排行榜

    評論排行榜

    轉(zhuǎn)自:http://blog.csdn.net/huangyunzeng2008/archive/2010/01/18/5209499.aspx 
    今天優(yōu)化了一個sql語句,感覺速度好像是快了點(diǎn),自己想想覺得也是,下面給出類似的例子,工作中的表就不拿來舉例了。實(shí)際我們平常都在憑著自己的感覺在寫SQL,其實(shí)跳出那個圈子你會發(fā)現(xiàn)能寫出更好的。

    一、先給出我的表和數(shù)據(jù),這里數(shù)據(jù)量少,可能不明顯,只是表明一下這個意思!

    create table EMP
    (
    EMPNO    NUMBER(4) not null,
    ENAME    VARCHAR2(10),
    JOB      VARCHAR2(9),
    MGR      NUMBER(4),
    HIREDATE DATE,
    SAL      NUMBER(7,2),
    DEPTNO   NUMBER(2)
    );
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, DEPTNO)
    values (7369, 'SMITH', 'CLERK', 7902, to_date('17-12-1980', 'dd-mm-yyyy'), 800, 20);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, DEPTNO)
    values (7499, 'ALLEN', 'SALESMAN', 7698, to_date('20-02-1981', 'dd-mm-yyyy'), 1600, 30);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, DEPTNO)
    values (7521, 'WARD', 'SALESMAN', 7698, to_date('22-02-1981', 'dd-mm-yyyy'), 1250, 30);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, DEPTNO)
    values (7566, 'JONES', 'MANAGER', 7839, to_date('02-04-1981', 'dd-mm-yyyy'), 2975, 20);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, DEPTNO)
    values (7654, 'MARTIN', 'SALESMAN', 7698, to_date('28-09-1981', 'dd-mm-yyyy'), 1250, 30);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, DEPTNO)
    values (7698, 'BLAKE', 'MANAGER', 7839, to_date('01-05-1981', 'dd-mm-yyyy'), 2850, 30);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, DEPTNO)
    values (7782, 'CLARK', 'MANAGER', 7839, to_date('09-06-1981', 'dd-mm-yyyy'), 2450, 10);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, DEPTNO)
    values (7788, 'SCOTT', 'ANALYST', 7566, to_date('19-04-1987', 'dd-mm-yyyy'), 3000, 20);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, DEPTNO)
    values (7844, 'TURNER', 'SALESMAN', 7698, to_date('08-09-1981', 'dd-mm-yyyy'), 1500, 30);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, DEPTNO)
    values (7876, 'ADAMS', 'CLERK', 7788, to_date('23-05-1987', 'dd-mm-yyyy'), 1100, 20);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, DEPTNO)
    values (7900, 'JAMES', 'CLERK', 7698, to_date('03-12-1981', 'dd-mm-yyyy'), 950, 30);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, DEPTNO)
    values (7902, 'FORD', 'ANALYST', 7566, to_date('03-12-1981', 'dd-mm-yyyy'), 3000, 20);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, DEPTNO)
    values (7934, 'MILLER', 'CLERK', 7782, to_date('23-01-1982', 'dd-mm-yyyy'), 1300, 10);
    commit;

    二、假設(shè)有這樣一個需求,我要得到這個表中所有低于所在部門平均工資的員工的基本信息。很自然的 我們會寫出這樣的SQL:

    SELECT *
    FROM emp A
    WHERE A.sal < (SELECT AVG(sal) FROM emp B WHERE A.deptno = B.deptno);
    這種寫法是很通常的寫法,也很好理解,從字面上看都知道是什么意思!但是在一個很大的表中這樣來統(tǒng)計是很慢很慢的,對于每一條記錄都要嵌套的查詢一個子查詢,這樣對性能影響是很大的。

    三、為什么不跳出這個思維的定式,換一種方法來統(tǒng)計呢,我給出下面的方法:

    SELECT A.*
    FROM emp A, (SELECT deptno, AVG(sal) sal FROM emp GROUP BY deptno) B
    WHERE A.deptno = B.deptno
    AND A.sal < B.sal;

    這里沒有使用嵌套子查詢,而是使用了關(guān)聯(lián)子查詢 ,這樣實(shí)際上也是很好理解的,但是往往我們很少這樣寫。

    四、總的來說我還是很喜歡下面的寫法,在數(shù)據(jù)量很大的情況下,對性能的提高真的不少,但是在數(shù)據(jù)量小的情況下似乎看不出什么效果。實(shí)際上也是,如果 數(shù)據(jù)量小,根本不會涉及到優(yōu)化,我在這里說也沒什么用。如果覺得自己的子查詢有問題,看看能不能把嵌套子查詢轉(zhuǎn)化為關(guān)聯(lián)子查詢,效果還是挺明顯的。



    posted on 2010-11-09 17:25 Ke 閱讀(1557) 評論(0)  編輯  收藏 所屬分類: oracle
    主站蜘蛛池模板: 国产精品99久久免费| 亚洲精品国产第一综合99久久| 国产一区二区三区无码免费| 亚洲精品视频免费看| 一级特黄录像免费播放肥| 亚洲AV无码国产剧情| 亚洲午夜电影在线观看| 亚洲成av人影院| 亚洲熟妇少妇任你躁在线观看无码| 毛片网站免费在线观看| 最近2019免费中文字幕6| 华人在线精品免费观看| 黄色视屏在线免费播放| 免费高清A级毛片在线播放| 亚洲丁香婷婷综合久久| 亚洲综合丁香婷婷六月香| 精品日韩亚洲AV无码| 久久夜色精品国产噜噜噜亚洲AV| 亚洲老妈激情一区二区三区| 国产精品亚洲αv天堂无码| 男人的天堂亚洲一区二区三区 | 久久精品国产亚洲AV未满十八| 91亚洲精品麻豆| 337p欧洲亚洲大胆艺术| 久久精品亚洲中文字幕无码麻豆| 亚洲精品成人无限看| 国产亚洲人成无码网在线观看| 亚洲国产成人影院播放| 亚洲日韩国产精品乱| 亚洲人成无码www久久久| 亚洲人成网站色在线入口| 亚洲美女在线国产| 亚洲av日韩av欧v在线天堂| 亚洲国产精品无码久久久久久曰| 亚洲AV无码专区日韩| 国产成人亚洲精品影院| 亚洲码国产精品高潮在线| 亚洲大尺度无码专区尤物| 色婷婷六月亚洲婷婷丁香| 亚洲国产成人精品电影| 亚洲第一成人在线|