select id from t where num=0
select id from t where num=10 union all select id from t where num=20
此關鍵字主要功能是把各個查詢語句的結果集合並到乙個結果集中返回給你。用法
union
union
...
滿足union的語句必須滿足:1.列數相同。 2.對應列數的資料型別要保持相容。
執行過程:
依次執行select語句–>>合併結果集—>>對結果集進行排序,過濾重覆記錄。
select * from
(( orde o left join orderproduct op on o.ordernum=op.ordernum )
inner join product p on op.pronum=p.productnum) where p.id<10000
union
select * from
(( orde o left join orderproduct op on o.ordernum=op.ordernum )
inner join product p on op.pronum=p.productnum) where p.id<20000 and p.id>=10000
union
select * from
(( orde o left join orderproduct op on o.ordernum=op.ordernum )
inner join product p on op.pronum=p.productnum) where p.id>20000 ---這裡可以寫p.id>100 結果一樣,因為他篩選過啦
----------------------------------對比上下兩個語句-----------------------------------------
select * from
(( orde o left join orderproduct op on o.ordernum=op.ordernum )
inner join product p on op.pronum=p.productnum)
由此可見效率確實低,所以不是在必要情況下避免使用。其實有他執行的第三部:對結果集進行排序,過濾重覆記錄。就能看出不是什麼好鳥。然而不對結果集排序過濾,顯然效率是比union高的,那麼不排序過濾的關鍵字有嗎?答,有,他是union all,使用union all能對union進行一定的優化。。
select id from t where num between 1 and 3
select id from t where num=100*2
select id from t where name like 'abc%'
create table #t(...)
select num from a where exists(select 1 from b where num=a.num)
保證不查詢多餘的列與行。
盡量避免select * 的存在,使用具體的列代替*,避免多餘的列
使用where限定具體要查詢的資料,避免多餘的行
使用top,distinct關鍵字減少多餘重複的行
distinct在查詢乙個字段或者很少欄位的情況下使用,會避免重複資料的出現,給查詢帶來優化效果。
但是查詢字段很多的情況下使用,則會大大降低查詢效率。
select count(*) from product
select top(1) id from product
很顯然下面完勝
首先你要弄明白你想要的資料是什麼樣子的,然後再做出決定使用哪一種連線,這很重要。
各種連線的取值大小為:
- 內連線結果集大小取決於左右表滿足條件的數量
- 左連線取決與左表大小,右相反。
- 完全連線和交叉連線取決與左右兩個表的資料總數量
select * from
( (select * from orde where orderid>10000) o left join orderproduct op on o.ordernum=op.ordernum )
select * from
( orde o left join orderproduct op on o.ordernum=op.ordernum )
where o.orderid>10000
由此可見減少連線表的資料數量可以提高效率。
insert插入優化
--建立臨時表
create table #tb1
( id int,
name nvarchar(30),
createtime datetime
)declare @i int
declare @sql varchar(1000)
set @i=0
while (@i<100000) --迴圈插入10w條資料
begin
set @i=@i+1
set @sql=' insert into #tb1 values('+convert(varchar(10),@i)+',''erzi'+convert(nvarchar(30),@i)+''','''+convert(nvarchar(30),getdate())+''')'
exec(@sql)
end
我這裡執行時間是51秒
--建立臨時表
create table #tb2
( id int,
name nvarchar(30),
createtime datetime
)declare @i int
declare @sql varchar(8000)
declare @j int
set @i=0
while (@i<10000) --迴圈插入10w條資料
begin
set @j=0
set @sql=' insert into #tb2 select '+convert(varchar(10),@i*100+@j)+',''erzi'+convert(nvarchar(30),@i*100+@j)+''','''+convert(varchar(50),getdate())+''''
set @i=@i+1
while(@j<10)
begin
set @sql=@sql+' union all select '+convert(varchar(10),@i*100+@j)+',''erzi'+convert(nvarchar(30),@i*100+@j)+''','''+convert(varchar(50),getdate())+''''
set @j=@j+1
end
exec(@sql)
enddrop table #tb2
select count(1) from #tb2
我這裡執行時間大概是20秒
分析說明:insert into select批量插入,明顯提公升效率。所以以後盡量避免乙個個迴圈插入。
優化修改刪除語句
如果你同時修改或刪除過多資料,會造成cpu利用率過高從而影響別人對資料庫的訪問。
如果你刪除或修改過多資料,採用單一迴圈操作,那麼會是效率很低,也就是操作時間過程會很漫長。
這樣你該怎麼做呢?
折中的辦法就是,分批運算元據。
delete product where id<1000
delete product where id>=1000 and id<2000
delete product where id>=2000 and id<3000
…當然這樣的優化方式不一定是最優的選擇,其實這三種方式都是可以的,這要根據你系統的訪問熱度來定奪,關鍵你要明白什麼樣的語句是什麼樣的效果。
SQL 語句優化 OR 語句優化案例
從上海來到溫州,看了前幾天監控的sql語句和資料變化,發現有一條語句的io次數很大,達到了150萬次io,而兩個表的資料也就不到20萬,為何有如此多的io次數,下面是執行語句 select ws.nodeid,wi.laststepid,wi.curstepid from workflowinfo ...
sql語句優化!
1.不要使用in操作符,這樣資料庫會進行全表掃瞄,推薦方案 在業務密集的sql當中盡量不採用in操作符 a 改為 a 4.is null 或is not null操作 判斷字段是否為空 5.及 操作符 大於或小於操作符 大於或小於操作符一般情況下是不用調整的,因為它有索引就會採用索引查詢,但有的情況...
SQL語句優化
explain sql 反饋sql語句執行資訊 1 優化 select min id as nid,uid pmzongfen updatetime picid gg from qd mouldu qd sell limit 1 select uid pmzongfen updatetime pic...