具有百万条记录的表中的Count即使有parallel提示也很慢
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有百万条记录的表中的Count即使有parallel提示也很慢相关的知识,希望对你有一定的参考价值。
我正在尝试从具有1.94亿条记录的表中计算记录数。使用了并行提示和索引快速扫描,但仍然很慢。请为所附查询提出其他替代或改进建议。
SELECT
/*+ parallel(sales 8)
index_ffs(sales ,sales_COMPDATE)
index_ffs(sales , sales_eventtypeseq )*/
COUNT(1)
FROM sales
WHERE processingunitseq=38
AND (compensationdate BETWEEN '28-JUL-17' AND '26-JAN-18'
OR eventtypeseq IN (1, 2, 3, 4));
该查询给出了结果,但花了2个小时才计算出1.94亿。
答案
让OR
和between
语句之间的in
运算符变慢了。
尝试以下查询。让我们尝试避免使用IN
运算符
SELECT (SELECT
COUNT(1)
FROM sales
WHERE processingunitseq=38
AND compensationdate BETWEEN '28-JUL-17' AND '26-JAN-18')
+
(SELECT SUM(CASE WHEN eventtypeseq = 1 THEN 1
WHEN eventtypeseq = 2 THEN 1
WHEN eventtypeseq = 3 THEN 1
WHEN eventtypeseq = 4 THEN 1
ELSE 0 END)
FROM sales
WHERE processingunitseq=38
另一答案
此外,如果compensationdate
是DATE
数据类型,请不要将其与strings比较(因为'28-JUL-17'
is一个字符串),并强制Oracle执行隐式转换并花费时间在< [无。切换到
compensationdate BETWEEN date '2017-07-28' and date '2018-01-26'
以上是关于具有百万条记录的表中的Count即使有parallel提示也很慢的主要内容,如果未能解决你的问题,请参考以下文章
性能 - 使用 Spring JPA Data 搜索具有 2000 万条记录的表
如何从 PostgreSQL 中的另一个表中更新具有随机 id 的表