【Oracle】COUNTの結果(項目指定の有り無し)INDEXにも影響
SQLの集合関数である「COUNT」ですが、
COUNT(*)とCOUNT(項目名)で走査と結果が違います
目次
テーブルの準備
「SHNCD:CHAR 5桁」、「URIKN:NUMBER 3桁」のテーブルとレコードを準備します
3行目の「URIKN」はNULLとします
主キーは「SHNCD」、実験なので「URIKN」にもINDEXを作成します
テーブル名は任意で、ここでは「TESTTBL」とします
![](https://www.prgkop.com/wp-content/uploads/2020/09/TBLNAIYO.png)
![](https://www.prgkop.com/wp-content/uploads/2020/09/KEY.png)
COUNT(*)の場合の結果(件数)
SELECT COUNT(*) FROM TESTTBL
結果は「3」となります
COUNT(SHNCD)の場合の結果(件数)
SELECT COUNT(SHNCD) FROM TESTTBL
結果は「3」となります
COUNT(URIKN)の場合の結果(件数)
SELECT COUNT(URIKN) FROM TESTTBL
結果は「2」となります
まとめ(件数)
COUNTの括弧の中に項目名を指定した場合、項目値がNULLのレコードは件数から除外されます
COUNT(*)とCOUNT(SHNCD)の場合の走査(INDEX)
GROUP BY なし
SELECT COUNT(*) FROM TESTTBL
SELECT COUNT(SHNCD) FROM TESTTBL
![](https://www.prgkop.com/wp-content/uploads/2020/09/1.png)
主キー(SHNCD)を使用して走査し、全件数を求めてます
GROUP BY に「SHNCD」指定
SELECT COUNT(*) FROM TESTTBL GROUP BY SHNCD
SELECT COUNT(SHNCD) FROM TESTTBL GROUP BY SHNCD
![](https://www.prgkop.com/wp-content/uploads/2020/09/2.png)
主キー(SHNCD)を使用して走査し、「SHNCD」毎の件数を求めています
結果の並びも主キーを使用し表示しています【SORT GROUP BY NOSORT】
GROUP BY に「URIKN」指定
SELECT COUNT(*) FROM TESTTBL GROUP BY URIKN
SELECT COUNT(SHNCD) FROM TESTTBL GROUP BY URIKN
![](https://www.prgkop.com/wp-content/uploads/2020/09/3.png)
通常のフルスキャンです
COUNT(URIKN)の場合の走査(INDEX)
GROUP BY なし
SELECT COUNT(URIKN) FROM TESTTBL
![](https://www.prgkop.com/wp-content/uploads/2020/09/4.png)
NONUNIQUE KEY(URIKN)を指定して走査し、全件数を求めてます
GROUP BY に「SHNCD」指定
SELECT COUNT(URIKN) FROM TESTTBL GROUP BY SHNCD
![](https://www.prgkop.com/wp-content/uploads/2020/09/5.png)
主キー(SHNCD)を使用して走査し、「SHNCD」毎の件数を求めています
結果の並びも主キーを使用し表示しています【SORT GROUP BY NOSORT】
もちろん、「URIKN」項目がNULLの件数はカウントされません
GROUP BY に「URIKN」指定
SELECT COUNT(URIKN) FROM TESTTBL GROUP BY URIKN
![](https://www.prgkop.com/wp-content/uploads/2020/09/6.png)
NONUNIQUE KEY(URIKN)を使用して走査し、「URIKN」毎の件数を求めています
結果の並びもNONUNIQUE KEY(URIKN)を使用し表示しています
【SORT GROUP BY NOSORT】
まとめ(INDEX)
上記の実験だとはっきりしないですが、COUNTにINDEXが使われる要件に、「NOT NULL制約」があります
主キーは必然に「NOT NULL制約」が付加されるので、この結果となります
「URIKN」項目にも「NOT NULL制約」を付加すると結果が変わってきます
でも、COUNTの括弧の中とGROUP BY に同じ項目を指定するとINDEXが使われています
奥が深いですね!
・・・何だか、まとめじゃなく、補足になってしまいました
この結果を踏まえて、バグやパフォーマンス悪化を回避して下さい
たまーに意味なく、COUNTの括弧の中に項目名指定すれって人がいるんだよなーってのはまた別の機会に・・・