sql - 查询优化时间更短
问题描述
我有表 emp,有 200 万条记录。“状态”列具有三个值,“永久”、“合同”、“实习”。执行需要很长时间。有什么方法可以优化这个查询,以便花费更少的时间。以下是查询:
SELECT dtls_info,
status,max(emp_id) -- COUNT(DISTINCT emp_id)
FROM (
SELECT status, dtls_info, emp_id
FROM (
SELECT status, dtls_info, emp_id, modif_date, MAX(emp_id) OVER() AS max_emp_id
FROM emp
)
WHERE emp_id >= max_emp_id - 200000
and modif_date > sysdate - 1 / 24
)
where emp_id >= (select min(emp_id) from emp)
GROUP BY status, dtls_info;
解决方案
最简单的查询可能看起来是这样的:
SELECT dtls_info,
status,
COUNT(DISTINCT emp_id) -- max(emp_id)
FROM emp
WHERE modif_date > sysdate - 1 / 24
and emp_id is not null
GROUP BY status, dtls_info;
如果有索引,这应该会执行得相当好,modif_date
因为您可能会执行索引范围扫描操作。即使它没有被索引,删除同一个表上不必要的子查询也会减少总运行时间(因为查询做的工作更少)。
令人担忧的是,您似乎需要对似乎应该是主键列的人群进行测试。如果您真的有空值,emp_id
那可能是您需要解决的应用程序中的错误。
我忽略了测试,max_emp_id
因为这似乎是为了加快速度而添加的东西,而不是有效的业务规则。
推荐阅读
- excel - 如果找不到文本,则返回 None
- java - 无法将元素添加到 ArrayList
- java - 从 Oracle NOSQL 检索批量数据时,获取类型无法创建 Double:类 oracle.kv.impl.api.table.IntegerDefImpl
- c# - 如何导入带有小数值的 CSV 文件,避免将小数作为日期格式
- javascript - AngularJS:向 Angular-rating-icons 添加工具提示?
- java - Selenium Web 驱动程序不从 java 中的 cssSelector 返回值
- html - 不寻常的弹性盒行为
- html - 如何更改访问过的帖子颜色,或在上面贴上徽章?
- elixir - 关于 Gettext 模块上的 pattern_match_cov 的透析器警告
- c - 指向作为函数参数的指针的指针