【Oracle】COUNTの結果(項目指定の有り無し)INDEXにも影響

2020年9月4日

SQLの集合関数である「COUNT」ですが、
COUNT(*)とCOUNT(項目名)で走査と結果が違います

テーブルの準備

「SHNCD:CHAR 5桁」、「URIKN:NUMBER 3桁」のテーブルとレコードを準備します
3行目の「URIKN」はNULLとします
主キーは「SHNCD」、実験なので「URIKN」にもINDEXを作成します
テーブル名は任意で、ここでは「TESTTBL」とします

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

主キー(SHNCD)を使用して走査し、全件数を求めてます

GROUP BY に「SHNCD」指定

SELECT COUNT(*) FROM TESTTBL GROUP BY SHNCD
SELECT COUNT(SHNCD) FROM TESTTBL GROUP BY SHNCD

主キー(SHNCD)を使用して走査し、「SHNCD」毎の件数を求めています
結果の並びも主キーを使用し表示しています【SORT GROUP BY NOSORT】

GROUP BY に「URIKN」指定

SELECT COUNT(*) FROM TESTTBL GROUP BY URIKN
SELECT COUNT(SHNCD) FROM TESTTBL GROUP BY URIKN

通常のフルスキャンです

COUNT(URIKN)の場合の走査(INDEX)

GROUP BY なし

SELECT COUNT(URIKN) FROM TESTTBL

NONUNIQUE KEY(URIKN)を指定して走査し、全件数を求めてます

GROUP BY に「SHNCD」指定

SELECT COUNT(URIKN) FROM TESTTBL GROUP BY SHNCD

主キー(SHNCD)を使用して走査し、「SHNCD」毎の件数を求めています
結果の並びも主キーを使用し表示しています【SORT GROUP BY NOSORT】
もちろん、「URIKN」項目がNULLの件数はカウントされません

GROUP BY に「URIKN」指定

SELECT COUNT(URIKN) FROM TESTTBL GROUP BY URIKN

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の括弧の中に項目名指定すれって人がいるんだよなーってのはまた別の機会に・・・

サイトマップ

2020年9月4日Oracle,SQL,データベース

Posted by こっぷ