具有百万条记录的表中的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亿。

答案

ORbetween语句之间的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 
另一答案

此外,如果compensationdateDATE数据类型,请不要将其与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 的表

删除数百万条记录 oracle [关闭]

如何从 db2 表中删除数百万条记录

处理具有数百万条记录更新和大量读数的 MySQL 表的最佳方法

向具有 4000 万条记录的表添加多列主键