於是有人就想起了union,其實它是可以替代or的,反正就是把結果串聯起來,貌似應該可以。而且,寫起來更加容易,看起來也很清晰。但是不知道兩個的性能如何呢?下面我就做一個比較,建立三張表,分別插入10萬,100萬和1000萬的數據,每張表格都有8個字段,然後在三種數據量下,做三個字段的or和union,五個字段的or和union,然後通過查詢時間比較一下他們的效率吧。
硬件環境:Q8200 4GB 內存
操作系統:Windows2003 R2
數據庫:SQL Server 2005
代碼
create database test
go
use test
go
--建立測試表1
create table table1
(
col1 varchar(20),
col2 varchar(20),
col3 varchar(20),
col4 varchar(20),
col5 varchar(20),
col6 varchar(20),
col7 varchar(20),
col8 varchar(20)
)
go
--插入10萬數據
declare @i int
set @i=1
while(@i<100000)
begin
insert into table1 values('123','123','123','123','123','123','123','123')
set @i=@i+1
end
go
--建立測試表2
create table table2
(
col1 varchar(20),
col2 varchar(20),
col3 varchar(20),
col4 varchar(20),
col5 varchar(20),
col6 varchar(20),
col7 varchar(20),
col8 varchar(20)
)
go
--插入100萬數據
declare @i int
set @i=1
while(@i<1000000)
begin
insert into table2 values('123','123','123','123','123','123','123','123')
set @i=@i+1
end
go
--建立測試表3
create table table3
(
col1 varchar(20),
col2 varchar(20),
col3 varchar(20),
col4 varchar(20),
col5 varchar(20),
col6 varchar(20),
col7 varchar(20),
col8 varchar(20)
)
go
--插入1000萬數據
declare @i int
set @i=1
while(@i<1000000)
begin
insert into table3 values('123','123','123','123','123','123','123','123')
set @i=@i+1
end
go
--耗時4秒
select * from table1
where col1='123' or col2='123' or col3='123'
go
--耗時11秒
select * from table1
where col1='123'
union all
select * from table1
where col2='123'
union all
select * from table1
where col3='123'
go
--耗時4秒
select * from table1
where col1='123' or col2='123' or col3='123' or col4='123' or col5='123'
go
--耗時19秒
select * from table1
where col1='123'
union all
select * from table1
where col2='123'
union all
select * from table1
where col3='123'
union all
select * from table1
where col4='123'
union all
select * from table1
where col5='123'
go
--耗時37秒
select * from table2
where col1='123' or col2='123' or col3='123'
go
--耗時1分53秒
select * from table2
where col1='123'
union all
select * from table2
where col2='123'
union all
select * from table2
where col3='123'
go
--耗時38秒
select * from table2
where col1='123' or col2='123' or col3='123' or col4='123' or col5='123'
go
--耗時2分24秒
select * from table2
where col1='123'
union all
select * from table2
where col2='123'
union all
select * from table2
where col3='123'
union all
select * from table2
where col4='123'
union all
select * from table2
where col5='123'
go
drop table table1
drop table table2
drop table table3
drop database test
從上面的可以看出來使用or和union連接where條件的話,數據10w和100w沒有差距,只是在1000w的時候急速增大,但是同等數據量的話,使用or和union就表現了很大的差距,盡管union寫起來和看起來都比較好理解。
結論:我想是因為每次使用union都會掃描一次表結構,or雖然難些難看,但是只掃描一次表結構,所以數據量上去的話,就會體現出來更大的優勢。
結論僅供參考,歡迎大家一起討論。
在sql查詢的where條件語句中,可以使用and和or實現邏輯的判斷。如果where比較復雜的話,就會產生and 和 or的嵌套使用,寫起來會很費力氣,看起來就更是一頭霧水了。
於是有人就想起了union,其實它是可以替代or的,反正就是把結果串聯起來,貌似應該可以。而且,寫起來更加容易,看起來也很清晰。但是不知道兩個的性能如何呢?下面我就做一個比較,建立三張表,分別插入10萬,100萬和1000萬的數據,每張表格都有8個字段,然後在三種數據量下,做三個字段的or和union,五個字段的or和union,然後通過查詢時間比較一下他們的效率吧。
硬件環境:Q8200 4GB 內存
操作系統:Windows2003 R2
數據庫:SQL Server 2005
代碼
create database test
go
use test
go
--建立測試表1
create table table1
(
col1 varchar(20),
col2 varchar(20),
col3 varchar(20),
col4 varchar(20),
col5 varchar(20),
col6 varchar(20),
col7 varchar(20),
col8 varchar(20)
)
go
--插入10萬數據
declare @i int
set @i=1
while(@i<100000)
begin
insert into table1 values('123','123','123','123','123','123','123','123')
set @i=@i+1
end
go
--建立測試表2
create table table2
(
col1 varchar(20),
col2 varchar(20),
col3 varchar(20),
col4 varchar(20),
col5 varchar(20),
col6 varchar(20),
col7 varchar(20),
col8 varchar(20)
)
go
--插入100萬數據
declare @i int
set @i=1
while(@i<1000000)
begin
insert into table2 values('123','123','123','123','123','123','123','123')
set @i=@i+1
end
go
--建立測試表3
create table table3
(
col1 varchar(20),
col2 varchar(20),
col3 varchar(20),
col4 varchar(20),
col5 varchar(20),
col6 varchar(20),
col7 varchar(20),
col8 varchar(20)
)
go
--插入1000萬數據
declare @i int
set @i=1
while(@i<1000000)
begin
insert into table3 values('123','123','123','123','123','123','123','123')
set @i=@i+1
end
go
--耗時4秒
select * from table1
where col1='123' or col2='123' or col3='123'
go
--耗時11秒
select * from table1
where col1='123'
union all
select * from table1
where col2='123'
union all
select * from table1
where col3='123'
go
--耗時4秒
select * from table1
where col1='123' or col2='123' or col3='123' or col4='123' or col5='123'
go
--耗時19秒
select * from table1
where col1='123'
union all
select * from table1
where col2='123'
union all
select * from table1
where col3='123'
union all
select * from table1
where col4='123'
union all
select * from table1
where col5='123'
go
--耗時37秒
select * from table2
where col1='123' or col2='123' or col3='123'
go
--耗時1分53秒
select * from table2
where col1='123'
union all
select * from table2
where col2='123'
union all
select * from table2
where col3='123'
go
--耗時38秒
select * from table2
where col1='123' or col2='123' or col3='123' or col4='123' or col5='123'
go
--耗時2分24秒
select * from table2
where col1='123'
union all
select * from table2
where col2='123'
union all
select * from table2
where col3='123'
union all
select * from table2
where col4='123'
union all
select * from table2
where col5='123'
go
drop table table1
drop table table2
drop table table3
drop database test
從上面的可以看出來使用or和union連接where條件的話,數據10w和100w沒有差距,只是在1000w的時候急速增大,但是同等數據量的話,使用or和union就表現了很大的差距,盡管union寫起來和看起來都比較好理解。
結論:我想是因為每次使用union都會掃描一次表結構,or雖然難些難看,但是只掃描一次表結構,所以數據量上去的話,就會體現出來更大的優勢。
結論僅供參考,歡迎大家一起討論。