SQL IN查詢優化

2022-04-17 13:41:01 字數 1918 閱讀 6287

實際專案中有如下sql, 發現效率很低,用時超過1分鐘

select taskid, startdate =

min(updatetime), enddate =

max(updatetime)

from

bfdb_code.dbo.packcodeinfo p

inner

join task t on p.taskid =

t.id

where

datediff(day, t.enddate, getdate()) <

@day

and t.status in(4,5

)

group

by taskid

通過查詢計畫可知上面語句進行了全表掃瞄,所以效率很低

單個查詢時並不慢,因為在taskid上已經建立索引

select taskid, startdate =

min(updatetime), enddate =

max(updatetime)

from

bfdb_code.dbo.packcodeinfo p

where p.taskid in (2488,2499

)group

by taskid

但如果是這樣查詢,仍然會全表掃瞄

select taskid, startdate =

min(updatetime), enddate =

max(updatetime)

from

bfdb_code.dbo.packcodeinfo p

where p.taskid in

(

select id from task t where t.status in(2,3))

group

by taskid

優化方案

去除inner join,寫乙個函式返回類似(2488,2499)值,然後動態構造sql語句執行。

函式定義get_begin_task

create

function

[dbo

].[get_begin_task]()

returns

varchar(1000) as

begin

declare

@csv

varchar(1000

)select

@csv

=coalesce(@csv+'

,', '') +

convert(varchar(10

), id)

from

task t

where t.status in(2,3

)

and createdate >=

'2016-05-01';

return

@csv

end;

修改儲存過程如:

declare

@sql

varchar(8000

);set

@sql='

select taskid, startdate = min(updatetime), enddate = max(updatetime)

from bfdb_code.dbo.packcodeinfo p

where p.taskid in (

'+ dbo.get_begin_task() +')

group by taskid

'exec(@sql);

小插曲:

因為用到了跨資料庫查詢,動態執行sql語句需要執行 exec sp_addlinkedserver  『bfdb_code』命令。

SQL IN 子查詢返回多個值

下午遇到乙個問題,in子查詢返回多個值。網上查了很多文件,資料,都沒收穫。問了技術群的同僚,竟然還被嘲笑了。in 怎麼可能匹配多個欄位呢!個人印象中曾經在 見到過,所以就覺得不服氣。自己慢慢地去試,試出來了。我們常用的in 操作是這樣的 select from tab t where t.col1 ...

SQL in與exists查詢的區別

先來簡單看看兩個查詢 in 等價於 1 select sno from student where s in 男 先執行in中的查詢 2 select sno,cno,grade from sc where sc.sno student.sno 以上in 中的查詢只執行一次,它查詢出student中...

查詢優化(MySQL優化查詢)

關聯查詢太多join 設計缺陷或不得已的需求 資料庫伺服器調優及各個引數設定不適當 緩衝 執行緒數等 慢查詢日誌 找出執行速度慢的sql語句 慢查詢的開啟並捕獲 explain 慢sql分析 show profile查詢sql在mysql伺服器裡面的執行細節和生命週期情況 sql資料庫伺服器的引數調...