查询不使用索引 -

Ary*_*han 3 sql database oracle indexing

我的问题涉及Oracle 11gr2以及SQL查询中索引的使用.请帮我解决下面的问题,我无法在此查询中使用索引:

SELECT ListingManagerID,
       FirstName,
       LastName,
       PrimaryPhone,
       AlternatePhone,
       Email,
       UserName,
       Password,
       RecallGuid,
       CustomerSince,
       PWChangeRequired,
       PWExpireDate,
       CallingHours,
       CreateDate,
       CreateIPAddress,
       LastLogin,
       AutoRenewFlag,
       LastUpdated,
       UpdatedBy,
       AutoRenewRemovedDate,
       AutoRenewDate,
       isSupplier,
       PrefferedLanguage,
       AboutMe,
       PictureFilePath,
       IsProfilePictureDisplay,
       LocaleID,
       Address1,
       Address2,
       CityID,
       CountryID,
       StateProvinceID,
       PostalCode,
       RegistrationSource,
       PPCTypeID,
       GhostUser,
       ProfileId,
       TimezoneID,
       OCA
FROM ListingManager
WHERE trim(lower(LISTINGMANAGERID)) = 'e.kkagacoe4aaae7rnr9lua5'
Run Code Online (Sandbox Code Playgroud)
  1. 创建索引

SQL> CREATE INDEX IDX_LISTINGMANAGER_ID ON listingmanager (LOWER(listingmanagerid));

索引已创建.

  1. 收集统计数据

SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('INTERSHOP', 'LISTINGMANAGER' , CASCADE=>TRUE);

PL/SQL过程成功完成.

索引已创建Listingmanager Column,但仍然执行计划显示全表扫描.我不知道为什么还会发生全表扫描.

ListingManagerID是表的主键,我可以修改主键创建的索引吗?

PLAN_TABLE_OUTPUT
--------------------------------------------------
| Id | Operation        | Name           | Rows | Bytes | Cost (%CPU)|    
--------------------------------------------------
| 0  | SELECT STATEMENT |                | 2013 | 487K| 1784 (1)|    
|* 1 | TABLE ACCESS FULL| LISTINGMANAGER | 2013 | 487K| 1784 (1)|
Run Code Online (Sandbox Code Playgroud)

谓词信息(由操作ID标识):

1 - filter(TRIM(LOWER("LISTINGMANAGERID"))='e.kkagacoe4aaae7rnr9lua5' )
Run Code Online (Sandbox Code Playgroud)

谢谢

Loz*_*ace 5

Oracle的功能索引非常敏感.您必须使用几乎完全用于在查询中创建索引的内容.我不是100%肯定,但甚至可能扩展到空白和括号.在任何情况下,您的索引都没有被修剪,因此它不会用在修剪的谓词上.

修剪和小写您的常量/参数而不是列(和/或存储修剪的,降低的副本),因此您根本不必使用基于函数的索引.如果列上有函数,则很难使用索引.