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

Защо индексът не се използва за тази заявка?

АКТУАЛИЗАЦИЯ: Опитайте да направите колоната col NOT NULL. Това е причината да не използва индекса. Когато не е нула, ето го планът.

SELECT STATEMENT, GOAL = ALL_ROWS           69  10  30
                    HASH GROUP BY           69  10  30
 INDEX FAST FULL SCAN   SANDBOX TEST_INDEX  56  98072   294216

Ако оптимизаторът определи, че е по-ефективно да НЕ се използва индексът (може би поради пренаписване на заявката), тогава няма да го направи. Съветите за оптимизатор са точно това, а именно съвети, за да кажете на Oracle индекс, който бихте харесали да го използвам. Можете да мислите за тях като за предложения. Но ако оптимизаторът реши, че е по-добре да не се използва индексът (отново в резултат на пренаписване на заявка например), тогава няма да го направи.

Вижте тази връзка:http://download. oracle.com/docs/cd/B19306_01/server.102/b14211/hintsref.htm "Определянето на една от тези подсказки кара оптимизатора да избере посочения път за достъп само ако пътят за достъп е наличен въз основа на съществуването на индекс или клъстер и на синтактичните конструкции на SQL оператора. Ако подсказката указва неналичен път за достъп, тогава оптимизаторът го игнорира."

Тъй като изпълнявате операция count(*), оптимизаторът е преценил, че е по-ефективно просто да сканирате цялата таблица и хеш, вместо да използвате вашия индекс.

Ето още една удобна връзка за подсказки:http://www.dba-oracle.com/t_hint_ignored. htm



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Извличане на времевата част от колоната TimeStamp в ORACLE

  2. Коригиране на грешка „ORA-01790:изразът трябва да има същия тип данни като съответния израз“

  3. защо този sql използва union all не върна данни

  4. създаване на синоним ora-01031 недостатъчни привилегии

  5. Oracle [Процедура] - Функцията Sum игнорира клаузата WHERE