SQL查詢分析

2021-09-05 22:58:21 字數 1734 閱讀 9950

有二個表.表bom資料量非常大.現是400w左右.表二pnostatus資料不大.現只有50條左右.

都是自增主鍵.表bom主鍵為idno,相關列有pno(這個每pno可能有3000多個相同的.),ldate(為資料插入時自動取當取時間).

表pnostatus有主建id,相關列有pno,updatetime,status. 

表bom每隔乙個小時都會匯入新資料(每次大約3000條,相同pno).因相關要求.匯入時更新相關表pnostatus.

規則就是在pnostatus的pno等於bom的pno取最大ldata.然後比較pnostatus的updatetime,後更新status.

最開始,按語意自然如下處理.

db.pnostatus.tolist().foreach(t =>

);

這樣處理後發現整個處理完要完時間8分鐘左右.現暫時還不影響.但是pnostatus資料變多後恐出問題.

先檢視這個語句.

select

max(

a.ldate)

from

bom as

a where

a.pno =

'sdf00000001'

這條資料處理就要求10s左右.50條語句就500s.差不多是時間8分鐘.

結合前幾天看的hashtable的原理.我自己推斷如下.索引查詢和表的資料多少沒有關係都是o(1)次查詢.我先在表bom

上想建立關於pno的索引.那想給出相關錯誤.沒有成功.

最後我在預設索引上idno上想辦法.想查詢對應pno的最大時間.而時間和idno有個明顯關係.idno越大.時間只會更大.不會更少.(表

bom不會編輯資料,只會匯入資料.)寫出如下sql.

select ldate from bom where idno = (

select max(idno) from bom as a where a.pno = 'sdf00000001'

)

說實話.我剛寫出來沒想有什麼效果.在我認為這完全是把簡單問題複雜化了.但是我執行了下.顯示1s!!

相應的現在整個時間44s就全部完成.

對應過程:

可以看到第二個查詢sql還進行了並行處理都要12s.而第乙個雖然複雜.但是時間短.

整個過程自己都還相對不是很明白.感覺有很大的巧合性.sql也不是我的專長.唯一肯定索引相對平常查詢優勢太明顯.希望給園友一點參考.

幾天後.我感到還是有點疑惑.試了如下二語句.

select max(idno) from bom as a where a.pno = 'sdf00000001'

select idno from bom as a where a.pno = 'sdf00000001'

發現第二條語句也還是10s左右,沒有什麼區別.分析插入資料時.ldate插入時都是一樣.而idno是自增的不一樣.就這點而導致二條語句取max(idno or ldate)是產生10倍差.

原先在我想法中.取max(idno)的值時會先把所有的idno取出來的再比較也是錯誤的.

他取max(idno)時應沒有取出相關的idno而得到最大值.不過有個新的問題出來了.他是如何取最大值的?

可惜我不知道是否相關工具能檢視到具體過程.希望有相關高手能提示下.

sql 分析函式 和 top N 查詢

sql 2003引進的視窗函授 也經常稱為分析函式 row number 指定的數字是連續的,也是唯一的 rank 指定的資料可以既不連續也不唯一 dense rank 產生的數字是連續的,但是不一定是唯一的。example select from select row number over or...

巢狀SQL的查詢速度比較分析

巢狀sql的查詢速度比較分析 文章中使用oracle自帶的hr資料庫,故 可以直接進行測試。一 select t.employee id,t.first name,t.phone number from hr.employees t where t.first name like a or t.fi...

MySQL 如何分析SQL的查詢效率

最近在學習深入mysql,記錄一下學習歷程和一些問題。在日常操作中,總會有一些查詢得比較慢的sql,但是造成查詢慢的原因有很多,那麼我們要怎麼樣才能準確的找到問題所在呢?先建立一張表 drop table if exists index test01 create table index test0...