無(wú)數(shù)次聽(tīng)到“不要寫count(*)要寫count(1),count(*)跑得慢”這種錯(cuò)誤說(shuō)法疙渣。
為什么count(1)與count(*)性能相同呢匙奴?因?yàn)閳?zhí)行計(jì)劃相同,性能相同妄荔。本篇以oracle 11g為例講解
首先 Oracle不允許純空行數(shù)據(jù)(即所有字段皆為null)泼菌,所以count(1)與count(*)結(jié)果必然相同,首先在無(wú)索引情況下 count(1) count(*) count(object_id) 的執(zhí)行計(jì)劃全部一樣全表掃描:
有索引情況再看啦租,count(1) count(*) count(object_id) 一樣哗伯,快速全掃描
Create Index IND_test_a On a (object_id,0)? --為什么建object,0組合索引 因?yàn)閛racle索引不存null篷角,所以加上0保證所有行都在索引中
如果將索引改為 Create Index IND_test_a On a (object_id)會(huì)怎么樣呢焊刹?count(1)與count(*)無(wú)法走索引,因?yàn)樗饕](méi)有包含所有行,只能全表掃秒虐块,而count(object)可以走索引快速全掃描俩滥。
SQL優(yōu)化不能靠瞎猜,而是分析SQL背后的實(shí)際執(zhí)行邏輯贺奠。