SQL各種寫法的效率問題

2021-04-14 11:41:09 字數 3520 閱讀 1058

問:

(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'

也可以這樣

:

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 tb select 1,ddd 1 union all select 1,5100 d union all select 1,5200 e 也可以這樣 ...

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...