我有一堆列表,是拆开一条一条执行效率高,还是凑成一句SQL执行效率高?
例如我有a,b,c。。n个字符串然后执行
SELECT *FROM shoushou WHERE NB IN(a,b,c。。n);
这样一种方式另外一种方式是SELECT *FROM shoushou WHERE NB='a';
SELECT *FROM shoushou WHERE NB='b';
SELECT *FROM shoushou WHERE NB='c';
SELECT *FROM shoushou WHERE NB='d';.............................SELECT *FROM shoushou WHERE NB='n';哪种方式效率高?或者还有没有更好的方式?

解决方案 »

  1.   

    应该是SELECT *FROM shoushou WHERE NB IN(a,b,c。。n); 扫描表shoushou 的次数少
      

  2.   

    例如我有a,b,c。。n个字符串 然后执行 
    SELECT *FROM shoushou WHERE NB IN(a,b,c。。n); 应该把a,b,c。。n
    拆分(可参见字符拆分精华)成一个表,连接查询SELECT *FROM shoushou T WHERE EXISTS(SELECT 1 FROM 拆分表 WHERE A=T.NB)
      

  3.   

    set statistics time on ----语句测试时间set statistics time off
      

  4.   

    SELECT *FROM shoushou WHERE NB IN(a,b,c。。n); 
      

  5.   

    1.凑成一句SQL执行效率高2.不推荐77的拆分成表进行连接查询,因为增加了拆分时间,其拆分出来的表也不会有索引的.
    直接拼串是最快的.
      

  6.   

    SELECT *FROM shoushou WHERE NB='a';
    SELECT *FROM shoushou WHERE NB='b';
    SELECT *FROM shoushou WHERE NB='c';
    SELECT *FROM shoushou WHERE NB='d';
    这种方式高。
      

  7.   

    --很明顯拆分得到是多個結果集合
    --覺得樓主應該比較的是這樣
    SELECT *FROM shoushou WHERE NB IN('a','b','c','d')
    --與
    SELECT *FROM shoushou WHERE NB='a'
    union all
    SELECT *FROM shoushou WHERE NB='b'
    union all
    SELECT *FROM shoushou WHERE NB='c'
    union all
    SELECT *FROM shoushou WHERE NB='d'
    --樓主可以在NB建立索引測試下看看
      

  8.   

    if object_id('id') is null drop table tb
    go
    create table tb(id int, name varchar(1),date datetime)insert into tb select rand()*10,char(cast(rand()*26+97 as int)),getdate()
    go 1000000 --产生100百万测试数据.这个效率很低,但是我很懒--测试in的时间
    set statistics time on SELECT *FROM tb WHERE name IN('a','b','c','d')set statistics time off
    /*
    (153362 行受影响)
    SQL Server 执行时间:
       CPU 时间 = 969 毫秒,占用时间 = 1995 毫秒。
    (153362 行受影响)*/
    --测试二
    set statistics time on SELECT * FROM tb WHERE name='a'
    union all
    SELECT * FROM tb WHERE name='b'
    union all
    SELECT * FROM tb WHERE name='c'
    union all
    SELECT * FROM tb WHERE name='d'set statistics time off
    /*SQL Server 执行时间:
       CPU 时间 = 1609 毫秒,占用时间 = 2037 毫秒。*/
      

  9.   

    if object_id('id') is null drop table tb
    go
    create table tb(id int, name varchar(1),date datetime)insert into tb select rand()*10,char(cast(rand()*26+97 as int)),getdate()
    go 1000000 --产生100百万测试数据.这个效率很低,但是我很懒
    --创建索引
    create index ix_name on tb(name)
    --清空缓存
    checkpoint
    dbcc freeproccache
    dbcc dropcleanbuffers
    --测试in的时间set statistics time on SELECT *FROM tb with (index=ix_name) WHERE name IN('a','b','c','d')set statistics time off
    /*
    (153362 行受影响)
    SQL Server 执行时间:
       CPU 时间 = 594 毫秒,占用时间 = 5398 毫秒。
    */
    --测试并行
    --再次清空缓存
    checkpoint
    dbcc freeproccache
    dbcc dropcleanbuffersset statistics time on 
    --SELECT *FROM tb WHERE name IN('a','b','c','d')SELECT * FROM tb with (index=ix_name) WHERE name='a'
    union all
    SELECT * FROM tb with (index=ix_name) WHERE name='b'
    union all
    SELECT * FROM tb with (index=ix_name) WHERE name='c'
    union all
    SELECT * FROM tb with (index=ix_name) WHERE name='d'set statistics time off
    /*
    SQL Server 执行时间:
       CPU 时间 = 548 毫秒,占用时间 = 1942 毫秒。
    */--不强制使用索引,它仍走的是表扫描
    --强制试用索引,in所消耗的时间明显增加,第二种时间到有所减少
      

  10.   

    恩我拿公司數據庫測試了下
    select count(*) from dgmocpb --190000左右
    select top 1 * from dgmocpb --50個字段
    --PB039為日期格式的聚合索引
    --每天數據量分佈平均,一下使測試數據
    dbcc freeproccache
    dbcc dropcleanbuffers
    set statistics time on 
    select * from dgmocpb where pb039='2010-02-01'
    union  all
    select * from  dgmocpb where  pb039='2010-02-02'
    union  all
    select * from  dgmocpb where pb039='2010-02-03'
    union  all
    select * from  dgmocpb where pb039='2010-02-04'
    union  all
    select * from  dgmocpb where pb039='2010-02-05'
    set statistics time off
    /*
    DBCC 的執行已經完成。如果 DBCC 印出錯誤訊息,請聯絡您的系統管理員。
    DBCC 的執行已經完成。如果 DBCC 印出錯誤訊息,請聯絡您的系統管理員。(2016 個資料列受到影響)SQL Server 執行次數: 
       CPU 時間 = 16 ms,  經過時間 = 1214 ms。
    */dbcc freeproccache
    dbcc dropcleanbuffers
    set statistics time on 
    select * from  dgmocpb where pb039>='2010-02-01' and pb039<='2010-02-05'
    set statistics time off
    /*
    DBCC 的執行已經完成。如果 DBCC 印出錯誤訊息,請聯絡您的系統管理員。
    DBCC 的執行已經完成。如果 DBCC 印出錯誤訊息,請聯絡您的系統管理員。
    SQL Server 剖析與編譯時間: 
       CPU 時間 = 0 ms,經過時間 = 1 ms。(2016 個資料列受到影響)SQL Server 執行次數: 
       CPU 時間 = 0 ms,  經過時間 = 1354 ms。
    */dbcc freeproccache
    dbcc dropcleanbuffers
    set statistics time on 
    select * from  dgmocpb where pb039 in ('2010-02-01','2010-02-02',
    '2010-02-03','2010-02-04','2010-02-05'
     )
    set statistics time off
    /*
    DBCC 的執行已經完成。如果 DBCC 印出錯誤訊息,請聯絡您的系統管理員。
    DBCC 的執行已經完成。如果 DBCC 印出錯誤訊息,請聯絡您的系統管理員。(2016 個資料列受到影響)SQL Server 執行次數: 
       CPU 時間 = 0 ms,  經過時間 = 1285 ms。
    */
    - -額貌似in 效率還高點?!
      

  11.   

    可能是我數據量不苟 - -?
    或許要千萬級別才比較看出來比較明顯
    不過之前看過一篇文章有說union all 這種分割
    一般是在查詢條件為不同字段的時候的,,切割合併會有明顯的提高效率,
    如果同一字段則不然
      

  12.   

                       顶下  up    
     up
      

  13.   

    一楼正解
    应该是SELECT *FROM shoushou WHERE NB IN('a','b','c'。。'n');