前面一條
在條件上建立索引
ps:第二個,如果select wko_orderno from res_order_cust where wko_so='25063541' 返回的值不唯一 會有語法錯誤

解决方案 »

  1.   

    select * from sc_jdbb where wo=(select wko_orderno from res_order_cust where wko_so='25063541')
    -->
    select * from sc_jdbb where wo IN (select wko_orderno from res_order_cust where wko_so='25063541')
    ps:但效率不高
      

  2.   

    select 
      * 
    from 
      sc_jdbb t
    where 
      exists(select 1from res_order_cust where wko_orderno=t.wo and wko_so='25063541')
    还可以试试这个
      

  3.   

    我知道如果用select * from sc_jdbb where wo in(select wko_orderno from res_order_cust where wko_so='25063541')
    效率肯定是不高。
    但如果在唯一的条件下再比效呢?
    select * from sc_jdbb a,res_order_cust b where a.WO=b.WKO_ORDERNO and b.wko_so='25063541'
    select * from sc_jdbb where wo=(select wko_orderno from res_order_cust where wko_so='25063541')
      

  4.   

    这个效率会高点
    select * from sc_jdbb where wo=(select wko_orderno from res_order_cust where wko_so='25063541')
      

  5.   


    首先,两条语句的作用不一样,也就是得到的结果是不一样的,在某些数据集下,两条语句的返回行的数目是可能不一样的。
    其次,第二条语句在某些数据集下可能产生语句执行错误。
    再次,在数据符合条件的情况下(也就是返回结果集是一样的)应该是第一条语句的检索速度要快。
    ps:不知是你的书写错误还是就是这样,第一条语句的结果集是两个表的字段,第二条语句的结果集是一个表的字段,
    自然在res_order是一个宽表的情况下,同时记录数远大于sc_jdbb的话,语句2的速度肯定快于语句1的速度,这里存在数据读取和网络传输的问题。
      

  6.   

    比较感兴趣,于是做了一个实验。系统环境:
    INTEL 赛扬 3.0GHz
    1.5GB RAM
    WINDOWS SERVER 2003 SP2
    SQLSERVER 2000 SP4被查询表TBL_CRO_CardCapitalFlow有547,778条记录,TBL_CRB_ClientOperationMethod表17条记录。
    每一条脚本查询后重启SQLSERVER服务(用于清空内存),重启服务后SQLSERVR.EXE进程内存占用稳定在63,268KB。
    第一条查询脚本:
    SELECT * FROM TBL_CRO_CardCapitalFlow 
    WHERE FK_OpCode IN (SELECT PK_OpCode FROM TBL_CRB_ClientOperationMethod WHERE SUBSTRING(PK_OpCode,1,1)='0')
    结果:返回记录65,955条,查询后SQLSERVR.EXE进程内存使用261,592KB,耗时21秒
    第二条查询脚本:
    SELECT * FROM TBL_CRO_CardCapitalFlow AS A, TBL_CRB_ClientOperationMethod AS B
    WHERE A.FK_OpCode IN (B.PK_OpCode) AND SUBSTRING(B.PK_OpCode,1,1)='0'
    结果:返回记录65,955条,查询后SQLSERVR.EXE进程内存使用261,912KB,耗时1分01秒
      

  7.   

    继续,第三条查询脚本:
    如果使用内联 INNER JOIN,速度在上面两者之间,35秒完成,进程的内存占用261,796KB,同样反馈65,955条记录。
    SELECT * FROM TBL_CRO_CardCapitalFlow AS A INNER JOIN TBL_CRB_ClientOperationMethod AS B
    ON 
    A.FK_OpCode IN (B.PK_OpCode) AND SUBSTRING(B.PK_OpCode,1,1)='0'
      

  8.   

    结果就是,楼主的第二条语句占绝对优势。
    第二条语句如果改成 select * from sc_jdbb where wo in(select wko_orderno from res_order_cust where wko_so='25063541') 就可以加大匹配数据量,获得更多的实验准确度。
      

  9.   

    视数据量的多少, 索引利用的情况而不同1. 数据量指标
    如果res_order_cust表中一个wko_so对应少量的wko_orderno, 当然,每二种占优势, 量大自然第一种占优势
        因为每二种MSSQL实际是执行两步, 先运行子查询把数据放在临时表中, 再将sc_jdbb和临时表做连接查询
        所有如果数据量小的话, 速度还是快, 数据量大的话子查询出来的数据会占用很多的资源, 第一种就有优势了2. 索引指标
    如果wko_so是表res_order_cust的主键, WO是表sc_jdbb的主键, 而WO与WKO_ORDERNO又存在外键关系
    当然是每一种占优势了
        因为MSSQL在优化查询时会先定位b.wko_so='25063541'条件的数据位置, 再关联查询, 自然就快了具体在LZ的系统里MSSQL的解释行为可以通过查询分析器启动显示查询计划来分析
    菜单 查询分析器=>查询=>显示执行计划, 然后再F5执行就查询看到了