程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> MSSQL技巧:SQL查詢的性能大PK之:or vs. union

MSSQL技巧:SQL查詢的性能大PK之:or vs. union

編輯:關於SqlServer
在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雖然難些難看,但是只掃描一次表結構,所以數據量上去的話,就會體現出來更大的優勢。

  結論僅供參考,歡迎大家一起討論。

  在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雖然難些難看,但是只掃描一次表結構,所以數據量上去的話,就會體現出來更大的優勢。

  結論僅供參考,歡迎大家一起討論。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved