J'ai trouvé des documents expliquant que oracle utilise pour le réglage des performances, etc, mais n'a pas tout à fait comprendre que ce qu'il ne fait en réalité. Peut quelqu'un me l'expliquer en termes simples avec des exemple de base ou quelque chose?
La plupart des bases de données d'entreprise, Oracle inclus, utiliser un optimiseur basé sur les coûts afin de déterminer le plan de requête pour une instruction SQL. Cela signifie que l'optimiseur utilise les informations sur les données afin de déterminer la façon d'exécuter une requête plutôt que de s'appuyer sur des règles (c'est ce que l'ancienne règle de base de l'optimiseur n').
Par exemple, imaginez une table pour un simple bug application de suivi de
CREATETABLE issues (
issue_id number primarykey,
issue_text clob,
issue_status varchar2(10));CREATEINDEX idx_issue_status
ON issues( issue_status );
Si je suis une grande entreprise, j'ai 1 million de lignes dans cette table. De ceux-ci, 100 ont un issue_status de l'ACTIF, de 10 000 ont un issue_status de file d'ATTENTE, et 989,900 ont un état de COMPLET. Si je veux exécuter une requête sur la table pour trouver mon actif questions
SELECT*FROM issues
WHERE issue_status ='ACTIVE'
l'optimiseur a un choix. Il peut soit utiliser l'index sur issue_status et ensuite faire une ligne unique de recherche dans la table pour chaque ligne dans l'index que les matchs ou il peut faire une analyse de table sur le issues table. Quel régime est le plus efficace dépend des données, qui est dans le tableau. Si Oracle attend de la requête, de rendre une petite fraction des données dans la table, à l'aide de l'indice serait plus efficace. Si Oracle prévoit la requête renvoie une fraction substantielle des données du tableau, un tableau d'analyse serait plus efficace.
DBMS_STATS.GATHER_TABLE_STATS est ce qui rassemble les statistiques qui permettent d'Oracle à prendre cette décision. Il raconte Oracle qu'il y a à peu près 1 million de lignes dans la table, qu'il y a 3 valeurs distinctes pour la issue_status colonne, et que les données sont réparties de manière inégale. Donc, Oracle sait utiliser un index pour la requête afin de trouver toutes les questions. Mais il sait aussi que lorsque vous tournez autour et essayer de chercher toutes les questions fermées
SELECT*FROM issues
WHERE issue_status ='CLOSED'
qu'il sera plus efficace de faire une analyse de la table.
La collecte de statistiques permet la modification des plans de requêtes plus de temps que les volumes de données et des données de distributions de changement. Lorsque vous installez l'outil de suivi, vous aurez très peu REMPLI de questions et plus ACTIF et en ATTENTE de questions. Au fil du temps, le nombre de questions augmente beaucoup plus rapidement. Comme vous obtenez plus de lignes dans la table et la fraction relative de ces lignes qui sont dans les différents statuts de changement, les plans de requête va changer de sorte que, dans le monde idéal, vous obtenez toujours le plan le plus efficace possible.
merci beaucoup Justin, cela fait sens. Regardé beaucoup de documentations sur GATHER_TABLE_STATS , C'est tellement bien expliqué. Merci pour le partage que vous en pensez!
La plupart des bases de données d'entreprise, Oracle inclus, utiliser un optimiseur basé sur les coûts afin de déterminer le plan de requête pour une instruction SQL. Cela signifie que l'optimiseur utilise les informations sur les données afin de déterminer la façon d'exécuter une requête plutôt que de s'appuyer sur des règles (c'est ce que l'ancienne règle de base de l'optimiseur n').
Par exemple, imaginez une table pour un simple bug application de suivi de
Si je suis une grande entreprise, j'ai 1 million de lignes dans cette table. De ceux-ci, 100 ont un
issue_status
de l'ACTIF, de 10 000 ont unissue_status
de file d'ATTENTE, et 989,900 ont un état de COMPLET. Si je veux exécuter une requête sur la table pour trouver mon actif questionsl'optimiseur a un choix. Il peut soit utiliser l'index sur
issue_status
et ensuite faire une ligne unique de recherche dans la table pour chaque ligne dans l'index que les matchs ou il peut faire une analyse de table sur leissues
table. Quel régime est le plus efficace dépend des données, qui est dans le tableau. Si Oracle attend de la requête, de rendre une petite fraction des données dans la table, à l'aide de l'indice serait plus efficace. Si Oracle prévoit la requête renvoie une fraction substantielle des données du tableau, un tableau d'analyse serait plus efficace.DBMS_STATS.GATHER_TABLE_STATS
est ce qui rassemble les statistiques qui permettent d'Oracle à prendre cette décision. Il raconte Oracle qu'il y a à peu près 1 million de lignes dans la table, qu'il y a 3 valeurs distinctes pour laissue_status
colonne, et que les données sont réparties de manière inégale. Donc, Oracle sait utiliser un index pour la requête afin de trouver toutes les questions. Mais il sait aussi que lorsque vous tournez autour et essayer de chercher toutes les questions ferméesqu'il sera plus efficace de faire une analyse de la table.
La collecte de statistiques permet la modification des plans de requêtes plus de temps que les volumes de données et des données de distributions de changement. Lorsque vous installez l'outil de suivi, vous aurez très peu REMPLI de questions et plus ACTIF et en ATTENTE de questions. Au fil du temps, le nombre de questions augmente beaucoup plus rapidement. Comme vous obtenez plus de lignes dans la table et la fraction relative de ces lignes qui sont dans les différents statuts de changement, les plans de requête va changer de sorte que, dans le monde idéal, vous obtenez toujours le plan le plus efficace possible.
Regardé beaucoup de documentations sur GATHER_TABLE_STATS , C'est tellement bien expliqué. Merci pour le partage que vous en pensez!
OriginalL'auteur Justin Cave