我有一堆列表,是拆开一条一条执行效率高,还是凑成一句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';哪种方式效率高?或者还有没有更好的方式?
例如我有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';哪种方式效率高?或者还有没有更好的方式?
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)
直接拼串是最快的.
SELECT *FROM shoushou WHERE NB='b';
SELECT *FROM shoushou WHERE NB='c';
SELECT *FROM shoushou WHERE NB='d';
这种方式高。
--覺得樓主應該比較的是這樣
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建立索引測試下看看
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 毫秒。*/
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所消耗的时间明显增加,第二种时间到有所减少
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 效率還高點?!
或許要千萬級別才比較看出來比較明顯
不過之前看過一篇文章有說union all 這種分割
一般是在查詢條件為不同字段的時候的,,切割合併會有明顯的提高效率,
如果同一字段則不然
up
应该是SELECT *FROM shoushou WHERE NB IN('a','b','c'。。'n');