做項目遇到的一個問題,稀奇古怪的!發來分享下!
先看下一條sql語句:
select t1.safecode,t1.corpcode,t1.corpname,sum(t.zxamtusd)
from 表1 as t,表2 as t1 where t1.safecode like '32%' and t1.corpcode like '%134754932%' and t.encode=t1.corpcode and t.recsts='4'
group by t1.safecode,t1.corpcode,t1.corpname
其中表1、表2的數據量時相當可觀的:分別擁有100000+的數據
注意上面的那條語句:其中有t.encode=t1.corpcode,並且對錶2進行了t1.corpcode like '%134754932%'限制,對錶1進行了t.recsts='4'限制,其實這裏對錶2的限制可以改爲對錶1的限制,因爲t.encode=t1.corpcode,但人有時就是有點固定思維,沒那麼做,以爲這樣的改動不會影響什麼,其實我們這種思維就是錯的!
問題出現了:這條語句在數據庫中運行不出來結果,出現類死鎖現象!
但當我將t1.corpcode like '%134754932%'改爲t.encode like '%134754932%',這樣很快就能運行出結果。
如下正確寫法:
select t1.safecode,t1.corpcode,t1.corpname,sum(t.zxamtusd)
from 表1 as t,表2 as t1 where t1.safecode like '32%' and t.encode like '%134754932%' and t.encode=t1.corpcode and t.recsts='4'
group by t1.safecode,t1.corpcode,t1.corpname
雖然這兩條語句表達的意思是一樣的,但運行時間是質的差別,上條語句沒能在我能忍受的時間內查出來(超過5分鐘!!!)!而第二條只需幾十秒。
懷疑原因:限制條件只對一張表操作,操作好後的結果,再與另一張表關聯,此時只有關聯操作而沒有了限制操作,所以對於大數據量的表,運行時間就有質的不同!(這只是本人的個人認爲,我也不是研究數據庫的,不是太瞭解內部運行機制!)
注意:不是說這裏不可以同時對兩張表進行限制,萬一用戶的需求就是那麼定的,我們必須對兩張表都進行一定的限制的時候,我們就別無辦法了。但我們在選擇限制的時候,特別是對那些對兩張表相等關聯的字段,同時又要對這些字段進行像上面語句那樣的like限制時,我們就得考慮清楚了,是否給數據操作添加了複雜度了!換個字段試試,或許效果就不一樣了!
望給遇到類似問題的兄弟們,有所幫助!