sql - 查询不使用索引 --

标签 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'
  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 列 上创建了索引,但执行计划仍然显示全表扫描。我不知道为什么全表扫描仍然发生。

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)|

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

1 - filter(TRIM(LOWER("LISTINGMANAGERID"))='e.kkagacoe4aaae7rnr9lua5' )

谢谢

最佳答案

Oracle 的函数索引极其敏感。您必须几乎完全使用您在查询中创建索引所用的内容。我不是 100% 确定,但这甚至可能扩展到空格和括号。在任何情况下,您的索引都没有被修剪,因此它不会被用于被修剪的谓词。

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

关于sql - 查询不使用索引 --,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16731198/

相关文章:

mysql - 从表中的所有列中选择所有非空值

asp.net - 获取MYSQL中的MaxRow Count/通过一次调用从过程中获取FOUND_ROWS和数据表

sql - 如何从 postgresql 中的表中删除单引号?

php - 从下拉列表中选择多个项目并发送到数据库

sql - 将复杂的 Oracle 查询转换为 Postgres

oracle - Oracle 中的一个实例与多个实例

oracle - 在全局临时表上创建索引

mysql - 如何打印主选择查询中嵌套查询的值?

php - 在 SQL/PHP 中,在 exec 函数问题中使用 SELECT 语句

sql - 迷你数据库 - 子查询返回超过 1 个值