The gather_system_stats('START'); is there to collect I/o and CPU performance of you system. But this syntax is there to collect data with a representative workload, and it should be followed by a gather_system_stats('STOP'); at the end of the workload.

I Have never tried to let it run without a stop, and I haven't found any references to what it can do if you don't stop it ...

Then you have a list of stats gathering on indexes but not on tables. The cascade => true should gather stats on all indexes.

But anyway if the stats on tables or indexes are stale they should be refreshed during next maintenance window.

Gather_stats('Start') will start to collect hardware statistics such as I/O and CPU perfomance and utilization. This should be followed by a Gather_stats('STOP')But the others will collect INDEX_statistics when you run those scripts. See this link.

Can you please tell me, are you all stats in business time? Because when you gather the statistics it will lock the objects some time. I am not sure that point just i am guessing. You can see whether did you get any object lock while gathering statistics.

Normaly system statistics would be collected only once. Of course, if your system changes drastically, for example while upgrading with faster CPUs or faster disks, then you would normaly recollect them. But there is certanly no need to recollect them repeatedly every day.

You must gather system statistics with dbms_stats.gather_system_stats during a typical load on your system. You can simply run the following:

SQL> exec dbms_stats.gather_system_stats('START');

After an hour or several hours run:

SQL> exec dbms_stats.gather_system_stats('STOP');

Your system stats will be stored in sys.aux_stats$. Check the values in this table whether the value for MREADTIM is bigger than SREADTIM. If this is not the case than system statistics will not be used.