【发布时间】:2018-07-12 06:25:22
【问题描述】:
Oracle 数据库。
我有以下 SQL 段,它正在对 PROVIDER P1 表执行全表扫描。我相信这是因为它动态地构建了一个like 子句,正如您在第 XXX 行看到的那样。
我在 PROVIDER.TERMINAL_NUMBER 上有一个索引,并且以下 SQL sn-p 确实使用了正确的索引。
select * from providers where terminal_number like '1234%'
那么为什么以下内容没有达到该索引?
SELECT P1.PROVIDER_NUMBER, P1.TERMINAL_NUMBER, PC."ORDER" FROM PROVIDERS P1
INNER JOIN PROVIDER_CONFIG PC
ON PC.PROVIDER_NUMBER = P1.PROVIDER_NUMBER
WHERE EXISTS (
SELECT E2.* FROM EQUIPMENT E1
INNER JOIN EQUIPMENT E2
ON E1.MERCHANT_NUMBER = E2.MERCHANT_NUMBER
WHERE E1.TERMINAL_NUMBER = 'SA323F'
AND E1.STATUS IN (0, 9)
AND E2.STATUS IN (0, 9)
XXX
AND P1.TERMINAL_NUMBER LIKE SUBSTR(E2.TERMINAL_NUMBER, 0, length(E2.TERMINAL_NUMBER) - 1) || '%'
)
ORDER BY PC."ORDER" DESC
【问题讨论】:
-
“我相信这是因为它动态构建了一个 like 子句” - 事实并非如此。
标签: sql oracle performance query-optimization