實際專案中有如下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資料庫伺服器的引數調...