gpt4 book ai didi

oracle - 一个查询,它作为单个查询的执行速度较慢,但​​在两步中完成时,只需几分之一秒

转载 作者:行者123 更新时间:2023-12-01 22:53:25 26 4
gpt4 key购买 nike

我在ORACLE DB中有两个 View :

The view USERS with columns:
UserId | GroupId | Details

每个用户有1条记录,总计40.000,并且大约c.a.每个组1-30个用户。


The view SUMMARY with columns:
UserId | Summary

每个用户有1条记录

概要 View 非常复杂,但是当我基于用户查询它时仍然非常快。
那是:
select * from SUMMARY where UserId='some_user_id'

在0.1秒内执行

USERS View 非常简单(它是所有USERS_TYPE1和USERS_TYPE2表的并集)
和类型的查询:
select * from USERS where GroupId='some_group_id'

在0.02秒内执行

现在要抓住了
当我做:
select * from USERS JOIN SUMMARY 
ON USERS.UserId = SUMMARY.UserId
WHERE USERS.GroupId = 'some_group_id'

我获得90秒的AWFUL性能-即使该组中只有3个用户。

如果首先找到用户标识,然后用这些用户标识查询SUMMARY表,则只需几分之一秒。
有什么方法可以提示数据库执行此操作吗?

我在所有基础表上都有基于UserId,GroupId和(GroupId,UserId)的索引。

((这很难以简单的方式重现,因为复杂的 View 有很多基础表。我有几个版本的SUMMARY View 。在某些情况下(取决于SUMMARY的构建方式),当情况变得糟糕时,我实现了“用户” View ,但在其他情况下则没有。))

最佳答案

你可以试试

  SELECT * 
FROM
(select * from USERS
WHERE USERS.GroupId = 'some_group_id') u,
summary
WHERE USERS.UserId = SUMMARY.UserId

还要确切指定所需的列,而不是选择*(您显然不需要两个版本的UserId)

可能值得尝试
  SELECT * 
FROM
(select users.*, rownum rn from USERS
WHERE USERS.GroupId = 'some_group_id') u,
summary
WHERE USERS.UserId = SUMMARY.UserId

这将迫使它首先评估内联 View 。

关于oracle - 一个查询,它作为单个查询的执行速度较慢,但​​在两步中完成时,只需几分之一秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6998292/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com