sql語句中選取限制字段的不同可能會對運行效率產生質的影響

      做項目遇到的一個問題,稀奇古怪的!發來分享下!

    先看下一條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限制時,我們就得考慮清楚了,是否給數據操作添加了複雜度了!換個字段試試,或許效果就不一樣了!

    望給遇到類似問題的兄弟們,有所幫助!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章