【发布时间】:2020-06-10 16:13:17
【问题描述】:
名为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'
)
【问题讨论】:
-
对我来说看起来不错。他们给出相同的结果吗?子选择几乎总是比不慢。如果可以,请避开它们。
-
从 9000 万条记录中仅排除 500 条记录总是需要时间。您可能会尝试对表进行分区。
-
@AnkitBajpai,我想要的真正结果是总结果中只有 500 条记录。
-
第一个版本很好。需要进行全表扫描。
-
@GordonLinoff,不,它运行这么慢,所以我的老板让我优化它。
标签: sql oracle oracle11g oracle10g