是在SQL查询中不使用时,优化此SQL语句的最佳方法吗?

问题描述 投票:0回答:1

称为TB_ORDER的表具有9000万条数据记录,但仅具有500条状态,即STATE既不是B也不是C。

SELECT 
    ORDER.ID,ORDER.STATE,ORDER.NAME 
FROM 
    TB_ORDER ORDER 
WHERE 
    ORDER.STATE NOT IN ('B','C') ; 

我的同事这样写sql,由于full table scan,它的成本大约为7分钟。所以我尝试像这样更改它。可以吗?我在状态字段上添加了索引。是否仍然是full table scan,因为子查询sql结果非常大((90000000-500)/ 90000000)?

SELECT 
    A.ID,A.NAME,A.STATE 
FROM TB_ORDER A 
WHERE 
    NOT EXISTS
        (
        SELECT 1 FROM TB_ORDER B WHERE A.ID=B.ID and B.STATE='B'
        UNION ALL
        SELECT 1 FROM TB_ORDER C WHERE A.ID=C.ID and C.STATE='C'
        )
sql oracle oracle11g oracle10g
1个回答
0
投票
您可以为此使用基于函数的索引。确保where子句与谓词完全匹配。示例:
© www.soinside.com 2019 - 2024. All rights reserved.