COUNT(*) vs COUNT(1) - ostateczne starcie


Po artykule Count(1) or count(*) oto jest pytanie padło wiele pytań w szczególności o dowód na to, że Oracle wewnętrznie przepisuje funkcję COUNT(1) na postać COUNT(*). 

W związku z tym przedstawiam sposób, jak samodzielnie się o tym przekonać!

1. Utworzenie tabeli CNT_TEST

create table cnt_test as select  rownum id, o.* from all_objects o; 

alter table cnt_test add constraint cnt_test_pk  primary key  (id);

2. Uruchomienie TRACE 10053

alter session set events '10053 trace name context forever, level  1';

3. Wykonanie zapytania

select count(*) cnt_str from all_objects;

3. Zatrzymanie TRACE

alter session set events '10053 trace name context off';

4. wyszukanie id zapytania

select sql_id, sql_text from v$sql  where sql_text like '%cnt_str%';

5. Zapis pliku TRACE

begin

SYS.DBMS_SQLDIAG.DUMP_TRACE(p_sql_id =>  <sql_id>
        p_child_number => 0, 
        p_component => 'Compiler',
        p_file_id => <nazwa pliku>);
       
end;

5. w pliku TRACE wyszukujemy informacja o transformacji zapytania 'Final query after transformations:'

W tym przypadku otrzymujemy taki wynik:

Final query after transformations:******* UNPARSED QUERY IS *******
SELECT COUNT(*) "CNT_STR" FROM "SYS"."CNT_TEST" "CNT_TEST"


Wyniki testu:

Count(*)
select count(*) cnt_str from all_objects;
Final query after transformations:******* UNPARSED QUERY IS *******
SELECT COUNT(*) "CNT_STR" FROM "SYS"."CNT_TEST" "CNT_TEST"
Count(1)
select count(1) cnt_1 from all_objects;
Final query after transformations:******* UNPARSED QUERY IS *******
SELECT COUNT(*) "CNT_1" FROM "SYS"."CNT_TEST" "CNT_TEST"
Count(id) – count na kolumnie Primary Key
select count(id) cnt_id from all_objects;
Final query after transformations:******* UNPARSED QUERY IS *******
SELECT COUNT(*) "CNT_ID" FROM "SYS"."CNT_TEST" "CNT_TEST"
count(object_id) –count na kolumnie not NULL
select count(object_id) cnt_not_null_coll from all_objects;
Final query after transformations:******* UNPARSED QUERY IS *******
SELECT COUNT(*) "CNT_NOT_NULL_COLL" FROM SYS."OBJ$" "SYS_ALIAS_16",SYS."USER$"

Count(OBJECT_TYPE) –count na kolumnie nullable
select count(OBJECT_TYPE) cnt_nullable from all_objects;
Final query after transformations:******* UNPARSED QUERY IS *******
SELECT COUNT(DECODE("SYS_ALIAS_17"."TYPE#",0,'NEXT OBJECT',1,'INDEX',2,

Komentarze