I just install Oracle Enterprise Linux on my new notebook.
I wanted to check how far could I improve the performance of a count(*)
SQL> drop table big_emp;
table big_emp dropped.
258ms elapsed
SQL> create table big_emp as
with l as(select 1 from dual connect by level<=3000)
select rownum empno,ename,job,mgr,hiredate,sal,comm,deptno from emp,l,l
table big_emp created.
330,390ms elapsed
SQL> alter table big_emp add primary key(empno)
table big_emp altered.
481,503ms elapsed
SQL> alter system flush buffer_cache
system flush altered.
2,701ms elapsed
SQL> alter system flush shared_pool
system flush altered.
137ms elapsed
SQL> select count(*) from big_emp
COUNT(*)
----------------------
126000000
9,769ms elapsed
SQL> select count(*) from big_emp
COUNT(*)
----------------------
126000000
8,157ms elapsed
SQL> alter table big_emp drop primary key
table big_emp altered.
905ms elapsed
SQL> alter table big_emp add primary key(empno)
using index (
create index big_i on big_emp(empno)
global partition by hash(empno)
partitions 16 parallel 16)
table big_emp altered.
974,300ms elapsed
SQL> alter system flush buffer_cache
system flush altered.
601ms elapsed
SQL> alter system flush shared_pool
system flush altered.
140ms elapsed
SQL> select count(*) from big_emp
COUNT(*)
----------------------
126000000
5,201ms elapsed
SQL> select count(*) from big_emp
COUNT(*)
----------------------
126000000
2,958ms elapsed
As it is on a notebook, I suppose the benefit of partitioning is not as good as you could get on your server with lots of fast disks and lot’s of CPUs, but I am pretty happy with the results.
It is still counting 126 Million rows in less than 3 seconds
Thanks for the very kind sponsor of the notebook !