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
Prześlij komentarz