Oracle
 sql >> база данни >  >> RDS >> Oracle

Защо Oracle използва DBMS_STATS.GATHER_TABLE_STATS?

Повечето корпоративни бази данни, включително Oracle, използват базиран на разходите оптимизатор, за да определят подходящия план за заявка за даден SQL израз. Това означава, че оптимизаторът използва информация за данните, за да определи как да изпълни заявка, вместо да разчита на правила (това е направил по-старият базиран на правила оптимизатор).

Например, представете си таблица за просто приложение за проследяване на грешки

CREATE TABLE issues (
  issue_id number primary key,
  issue_text clob,
  issue_status varchar2(10)
);

CREATE INDEX idx_issue_status
    ON issues( issue_status );

Ако съм голяма компания, може да имам 1 милион реда в тази таблица. От тях 100 имат issue_status от ACTIVE, 10 000 имат issue_status на ЧЕШКАТА, а 989 ​​900 имат статус ЗАВЪРШЕН. Ако искам да изпълня заявка към таблицата, за да намеря активните си проблеми

SELECT *
  FROM issues
 WHERE issue_status = 'ACTIVE'

оптимизаторът има избор. Може или да използва индекса на issue_status и след това направете едноредово търсене в таблицата за всеки ред в индекса, който съвпада или може да направи сканиране на таблицата за issues маса. Кой план е по-ефективен ще зависи от данните, които са в таблицата. Ако Oracle очаква заявката да върне малка част от данните в таблицата, използването на индекса би било по-ефективно. Ако Oracle очаква заявката да върне значителна част от данните в таблицата, сканирането на таблицата би било по-ефективно.

DBMS_STATS.GATHER_TABLE_STATS е това, което събира статистическите данни, които позволяват на Oracle да направи това решение. Той казва на Oracle, че има приблизително 1 милион реда в таблицата, че има 3 различни стойности за issue_status колона и че данните са неравномерно разпределени. Така Oracle знае да използва индекс за заявката, за да намери всички активни проблеми. Но също така знае това, когато се обърнеш и се опиташ да потърсиш всички затворени въпроси

SELECT *
  FROM issues
 WHERE issue_status = 'CLOSED'

че ще бъде по-ефективно да се направи сканиране на таблица.

Събирането на статистически данни позволява плановете на заявката да се променят с течение на времето, тъй като обемите на данните и разпределението на данните се променят. Когато за първи път инсталирате програмата за проследяване на проблеми, ще имате много малко ЗАВЪРШЕНИ проблеми и повече АКТИВНИ и ПРЕДСТАВЯНИ проблеми. С течение на времето броят на ЗАВЪРШЕНИ проблеми нараства много по-бързо. Тъй като получавате повече редове в таблицата и относителната част на тези редове, които са в различните състояния, се променят, плановете на заявките ще се променят, така че в идеалния свят винаги получавате възможно най-ефективния план.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какъв е максималният размер на VARCHAR2 в PL/SQL и SQL?

  2. Булево поле в Oracle

  3. Полезни запитвания за изтичане на паролата/политика/Настройки на oracle EBS

  4. Изявление FORALL с клауза VALUES-OF Bound в базата данни на Oracle

  5. Свързване към база данни на Oracle с помощта на SQLAlchemy