
SQL調(diào)優(yōu)-表統(tǒng)計(jì)信息未及時(shí)更新導(dǎo)致查詢超級(jí)慢
某日同事丟給我一個(gè)看上去復(fù)雜的查詢(實(shí)際就涉及兩張表,套來套去)說只是換了日期條件,但一個(gè)查詢5秒出數(shù)據(jù),一個(gè)根本查不出來?,F(xiàn)在整理下解決過程,及涉及的知識(shí)點(diǎn)。
若有不正之處,請(qǐng)多多諒解并歡迎批評(píng)指正,不甚感激。
一.問題描述
環(huán)境:sqlserver 2008r2
現(xiàn)象:查詢涉及到兩張表
ODS_TABLE_A 每日數(shù)據(jù)700萬現(xiàn)在總計(jì)60多億。已建立索引+分區(qū)
MID_TABLE_B 每日數(shù)據(jù)20萬 總計(jì)3000萬。已建立索引未分區(qū)
當(dāng)etldate為 ‘2016-08-12’ 及以前的時(shí)間時(shí),本查詢5秒出數(shù)據(jù),
當(dāng)etldate為 ‘2016-08-16’ 及以后的時(shí)間時(shí),本查詢出不來數(shù)據(jù)。
貼上問題sql:做過數(shù)據(jù)字段處理,針對(duì)本篇主題注意點(diǎn)放在查詢因?yàn)槿掌诘倪x擇不同導(dǎo)致查詢時(shí)間變的超級(jí)慢,而不是改變sql寫法比如用臨時(shí)表,強(qiáng)制索引上。
———-《代碼開始》
select
COUNT(distinct(case when COL_USERID3 is null then COL_USERID6 end)) as 'aa',
COUNT(distinct(case when COL_USERID3 is null and COL_USERID7 is not null then COL_USERID6 end)) as 'bb',
COUNT(distinct(case when COL_USERID3 is not null then COL_USERID6 end)) as 'cc',
COUNT(distinct(case when COL_USERID3 is not null and COL_USERID7 is not null then COL_USERID6 end)) as 'dd',
SUM(case when COL_USERID3 IS not null then ee end) as 'ee'
from
(
select c.COL_USERID3,c.ee,g.COL_USERID6
from
(
select b.COL_USERID2 as COL_USERID3,COUNT(b.COL_USERID2) as ee
from
(
select COL_USERID as COL_USERID1,min(EventTime) as time1
from ODS_TABLE_A
where EtlDate = '2016-08-12'
and colid LIKE 'heihei%'
group by COL_USERID
)as a
join
(
select COL_USERID as COL_USERID2,eventtime as time2
from ODS_TABLE_A
where EtlDate = '2016-08-12'
and ItemId = '1111111111101'
and colid like 'haha-%'
and colid not like 'haha-skill%'
and colid not like 'haha-fine%'
)as b
on a.COL_USERID1 = b.COL_USERID2 and a.time1 > b.time2
group by b.COL_USERID2
)as c
right join
(
select DISTINCT d.COL_USERID4 as COL_USERID6
from
(
select distinct COL_USERID as COL_USERID4
from MID_TABLE_B
where etldate = '2016-08-12'
)as d
join
(
select COL_USERID AS COL_USERID5
from ODS_TABLE_A
where EtlDate = '2016-08-12'
and colid LIKE 'heihei%'
)as f
on d.COL_USERID4 = f.COL_USERID5
)as g
on c.COL_USERID3 = g.COL_USERID6
)as i
left join
(
select COL_USERID as COL_USERID7
from MID_TABLE_B
where EtlDate = '2016-08-12'
and IsTodayPay = '1'
)as h
on i.COL_USERID6 = h.COL_USERID7
———-《代碼結(jié)束》
二。解決過程
1.先看了下上述代碼的執(zhí)行計(jì)劃如下圖初看上去需要用索引的地方都用到了。應(yīng)該沒啥大問題。
可能你注意到系統(tǒng)提示的缺少索引信息,加上去一樣效果,不能解決‘2016-08-16’ 查詢慢的問題。
2.在修改下日期 ,就是把 【所有】etldate=‘2016-08-12’ 的改成 etldate=‘2016-08-16’
看下執(zhí)行計(jì)劃:對(duì)不起跑了半個(gè)小時(shí)沒出來,查看估計(jì)的執(zhí)行執(zhí)行和上面的圖類似。
減少涉及到數(shù)據(jù)集的量 加top 1 我再看執(zhí)行計(jì)劃:不貼圖了 結(jié)果就是比上面的圖少了個(gè)【并行度】
初步以為是優(yōu)化器因?yàn)楣烙?jì)行數(shù)等不準(zhǔn)的原因沒選擇并行度,趕緊找代碼讓它強(qiáng)行這樣走。
二話不說加關(guān)鍵字OPTION(querytraceon 8649),可是應(yīng)用到實(shí)際發(fā)現(xiàn)查詢效率無任何改善,久久不出結(jié)果。后來問宋大師(感謝宋大神)。他說有些操作是沒法并行的,更新統(tǒng)計(jì)信息試試先。
執(zhí)行如下代碼:
update STATISTICS ODS_TABLE_A –(把ODS_TABLE_A 這個(gè)大表統(tǒng)計(jì)信息更新)
默認(rèn)情況下,查詢優(yōu)化器已根據(jù)需要更新統(tǒng)計(jì)信息以改進(jìn)查詢計(jì)劃;但在某些情況下,你可以通過使用 UPDATE STATISTICS 或存儲(chǔ)過程 sp_updatestats 來比默認(rèn)更新更頻繁地更新統(tǒng)計(jì)信息,提高查詢性能。針對(duì)文中此種情況新插入的數(shù)據(jù)沒統(tǒng)計(jì)信息,大表自動(dòng)更新統(tǒng)計(jì)信息觸發(fā)自動(dòng)更新機(jī)制頻率不夠,最好定期更新。
至此問題解決。
三、總結(jié)
對(duì)于大表新插入的數(shù)據(jù)沒及時(shí)更新統(tǒng)計(jì)信息,導(dǎo)致出現(xiàn)上面文中的現(xiàn)象,一個(gè)日期導(dǎo)致查詢效率天壤之別的分水嶺(查12號(hào)前5秒出數(shù)據(jù),查12號(hào)后死活不出來。)
解決辦法是大表自動(dòng)更新統(tǒng)計(jì)信息觸發(fā)自動(dòng)更新機(jī)制頻率不夠,定期更新。
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場(chǎng)景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場(chǎng)景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請(qǐng)求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請(qǐng)求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營問題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場(chǎng)景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡(jiǎn)單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10CDA 數(shù)據(jù)分析師:商業(yè)數(shù)據(jù)分析實(shí)踐的落地者與價(jià)值創(chuàng)造者 商業(yè)數(shù)據(jù)分析的價(jià)值,最終要在 “實(shí)踐” 中體現(xiàn) —— 脫離業(yè)務(wù)場(chǎng)景的分 ...
2025-09-10