SQL各種寫法的效率問題

2021-09-08 15:28:45 字數 1728 閱讀 9294

問:

(1)一次插入多條資料時:

create table tb(id int, 名稱 nvarchar(30), 備註 nvarchar(1000))

insert tb   select 1,'ddd',1

union  all        select 1,'5100','d'

union  all        select 1,'5200','e'

也可以這樣:

create table tb1(id int, 名稱 nvarchar(30), 備註 nvarchar(1000))

insert tb1 (id,名稱,備註)values(1,'ddd',1)

insert tb1 (id,名稱,備註)values(1,'5100','d')

insert tb1 (id,名稱,備註)values(1,'5200','e')

上面兩種方法,哪種方法效率高?

答:第1種好一些, 但也得有個量的控制, 因為第1種的union all是作為乙個語句整體, 查詢優化器會嘗試做優化, 同時, 也要先算出這個結果再插入的.

問:(2)賦值時:

select @a=n'aa'

set @a=n'aa'

上面兩種方法,哪種方法效率高?

答:如果是單個賦值, 沒有什麼好比較的話.

不過, 如果是為多個變數賦值, 經測試, select 一次性賦值, 比用set 逐個賦值效率好..

問:(3)取前幾條資料時

set rowcount 2 select * from tb order by fd

select top 2 * from tb order by fd

上面兩種方法,哪種方法效率高?

答:set rowcount和top 是一樣的, 包括執行的計畫等都是一樣的

問:(4)條件判斷時

where 0<(select count(*) from tb where ……)

where exists(select * from tb where ……)

上面兩種方法,哪種方法效率高?

答:這個一般是exists快, 當然, 具體還要看你後面的子查詢的條件, 是否會引用外層查詢中的物件的列.

exists檢查到有值就返回, 而且不返回結果集, count需要統計出所有滿足條件的, 再返回乙個結果集, 所以一般情況下exists快.

問:(5)nullif的使用----->同理它的反函式isnull的使用

update tb set fd=case when fd=1 then null else fd end

update tb set fd=nullif(fd,1)

上面兩種方法,哪種方法效率高?

答:應該是一樣的

問:6)從字串中取子字串時

substring('abcdefg',1,3)

left('abcderg',3)_

上面兩種方法,哪種方法效率高?

答:基本上是一樣的

問:(7)except和not in的區別?

答:except會去重複, not in 不會(除非你在select中顯式指定)

except用於比較的列是所有列, 除非寫子查詢限制列, not in 沒有這種情況

問:(8)intersect和union的區別?

答:intersect是兩個查詢都有的非重複值(交集), union是兩個查詢結果的所有不重複值(並集)

csdn上對應的帖子

SQL各種寫法的效率問題

問 1 一次插入多條資料時 create table tb id int,名稱nvarchar 30 備註nvarchar 1000 insert tbselect 1,ddd 1 union allselect 1,5100 d union allselect 1,5200 e 也可以這樣 cre...

SQL各種寫法的效率問題

問 1 一次插入多條資料時 create table tb id int,名稱nvarchar 30 備註nvarchar 1000 insert tbselect 1,ddd 1 union allselect 1,5100 d union allselect 1,5200 e 也可以這樣 cre...

SQL各種寫法的效率問題

問 1 一次插入多條資料時 create table tb id int,名稱nvarchar 30 備註nvarchar 1000 insert tb select 1,ddd 1 union all select 1,5100 d union all select 1,5200 e 也可以這樣 ...