我们的应用程序在其中一个环境中突然变慢了。我所做的唯一更改是更改了 SQL。发布之前,SQL是这样的
Select EmployeeId
From Employee
Where Dept='CS'
and record_state='ACTIVE'
and EmployeeTypeId ='1'
发布后SQL为
Select EmployeeId
From Employee Where Dept='CS'
and record_state='ACTIVE'
and EmployeeTypeId IN ('1','2')
该表的索引是employee_state_id_index (Dept,record_state,EmployeeTypeId) 索引没有改变。这个索引对新的SQL没有帮助吗?新的SQL是否扫描整个表?我不知道索引如何与 in 子句一起使用。感谢您的帮助和评论
查询的解释计划是
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
| 0 | DELETE STATEMENT | | 1 | 57 | 4 (0)|
| 1 | DELETE | Employee | | | |
|* 2 | INDEX RANGE SCAN| employee_state_id_index | 1 | 57 | 4 (0)|
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
2 - access("C"."Dept"='CS' AND
"C"."RECORD_STATE"='ACTIVE')
filter("C"."EmployeeTypeId"='1' OR
"C"."EmployeeTypeId"='2')
最佳答案
我们面临的问题的解决方案是重新索引表。该表有 1000 万条记录,我们最近清理了表中的数据(当我们意识到有重复记录时),并将其减少到之前记录数量的近一半。所以我们认为我们会尝试重新索引,因为无论如何它都需要它。这很有帮助:)
关于带 in 子句的 SQL 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14955077/