J'optimise les requêtes SQL sur une base de données Oracle. Je veux m'assurer que tous les éléments mis en cache sont effacés avant d'exécuter chaque requête afin d'éviter des résultats de performance trompeurs. J'efface le pool partagé (pour se débarrasser des plans SQL mis en cache/expliquer) et le cache du tampon (pour se débarrasser des données mises en cache) en exécutant les commandes suivantes:
alter system flush buffer_cache;
alter system flush shared_pool;
Est-ce que je devrais faire plus ou est-ce suffisant?
Merci!
Le vidage du pool partagé devrait le faire, mais Tom Kyte énumère ci-dessous quelques raisons pour lesquelles vous ne pouvez pas obtenir le résultat que vous attendez dans certains cas:
http://asktom.Oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:634939141109
Gardez à l'esprit que le système d'exploitation et le matériel font également de la mise en cache, ce qui peut fausser vos résultats.
Vous devez également collecter des statistiques, que ce soit pour vos schémas ou même pour toute la base de données:
begin
dbms_stats.gather_schema_stats('schema_name');
end;
ou
begin
dbms_stats.gather_database_stats;
end;
Et puis videz le pool partagé.
Je dirais que vous présenteriez un résultat trompeur car vous avez effacé toutes les caches. La base de données dans le monde réel, n'est jamais dans cet état qu'une seule fois dans sa vie. En fait, lors des tests de performances, il est généralement admis d'exécuter une requête plusieurs fois afin que vous puissiez voir les avantages de la mise en cache (et d'autres optimisations).