在 Oracle 中使用 like '%%' 时如何使用提示?它使用索引但不起作用
How to use hints when using like '%%' in Oracle?It use index but do not work
我有一个名为 TB_STUDENT
的 table,它有两个名为 STUDENT_NAME
、STUDENT_ID
、STUDENT_NUMBER
的字段,并且至少有 100000 行数据。现在我已经创建了两个索引,我想根据 student_name 搜索学生。我有使用提示,但它似乎仍然是 TABLE ACCESS FULL
。如何更改我的 SQL?
CREATE index IDX_STUDENT_ID ON CUST (STUDENT_ID);
CREATE index IDX_STUDENT_NAME ON CUST (STUDENT_NAME);
SELECT /*+ INDEX(IDX_STUDENT_ID ,IDX_STUDENT_NAME ) */STUDENT_ID,STUDENT_NAME FROM TB_STUDENT S WHERE STUDENT_NAME LIKE '%LUSY%';
索引将数据存储在排序树中,使搜索更容易。对于 varchar
列,这意味着数据按字典顺序排序。如果在字符串的末尾(甚至中间)有一个通配符,那么使用索引是有意义的,但在这里,您在字符串的开头有一个通配符,这意味着该值可以是 索引中的任意位置。在这种情况下,使用索引比扫描整个 table 没有任何好处,优化器将选择不使用索引。提示正如其名称所暗示的那样 - 提示 - 并且不能强制优化器在无效用例中使用索引。
我有一个名为 TB_STUDENT
的 table,它有两个名为 STUDENT_NAME
、STUDENT_ID
、STUDENT_NUMBER
的字段,并且至少有 100000 行数据。现在我已经创建了两个索引,我想根据 student_name 搜索学生。我有使用提示,但它似乎仍然是 TABLE ACCESS FULL
。如何更改我的 SQL?
CREATE index IDX_STUDENT_ID ON CUST (STUDENT_ID);
CREATE index IDX_STUDENT_NAME ON CUST (STUDENT_NAME);
SELECT /*+ INDEX(IDX_STUDENT_ID ,IDX_STUDENT_NAME ) */STUDENT_ID,STUDENT_NAME FROM TB_STUDENT S WHERE STUDENT_NAME LIKE '%LUSY%';
索引将数据存储在排序树中,使搜索更容易。对于 varchar
列,这意味着数据按字典顺序排序。如果在字符串的末尾(甚至中间)有一个通配符,那么使用索引是有意义的,但在这里,您在字符串的开头有一个通配符,这意味着该值可以是 索引中的任意位置。在这种情况下,使用索引比扫描整个 table 没有任何好处,优化器将选择不使用索引。提示正如其名称所暗示的那样 - 提示 - 并且不能强制优化器在无效用例中使用索引。