Простой запрос по индексу выполняется 465 секунд!
SELECT A.ID, A.LOGIN, A.NAME, A.LASTNAME, A.EMAIL FROM ACCOUNT A WHERE (A.LOGIN LIKE '%%') AND (A.NAME LIKE '%Кудряшов%' OR A.LASTNAME LIKE '%Кудряшов%') AND A.COMPANY_ID = 1 ORDER BY A.LOGIN
Это странно, поскольку одно из условий A.COMPANY_ID = 1 обладает высокой избирательностью
SQL> SELECT 'ALL' as "Condition", count(*) FROM ACCOUNT A 2 union 3 SELECT 'COMPANY_ID = 1' as "Condition", count(*) FROM ACCOUNT A WHERE A.COMPANY_ID = 1; Condition COUNT(*) -------------------------------- ---------- ALL 2293282 COMPANY_ID = 1 361
, столбец ACCOUNT.COMPANY_ID проиндексирован и команда EXPLAIN PLAN показывает, что именно этот индекс используется!
SQL> explain plan for SELECT A.ID, A.LOGIN, A.NAME, A.LASTNAME, A.EMAIL FROM ACCOUNT A WHERE (A.LOGIN LIKE '%%') AND (A.NAME LIKE '%Кудряшов%' OR A.LASTNAME LIKE '%Кудряшов%') AND A.COMPANY_ID = 1 ORDER BY A.LOGIN / Explained. SQL> select * from table(dbms_xplan.display); PLAN_TABLE_OUTPUT ----------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost | ----------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 66 | 5 | | 1 | SORT ORDER BY | | 1 | 66 | 5 | | 2 | TABLE ACCESS BY INDEX ROWID| ACCOUNT | 1 | 66 | 4 | | 3 | INDEX RANGE SCAN | IX_ACCOUNT_COMPANY_ID | 1 | | 3 | -----------------------------------------------------------------------------------------