Oracle 一种查询,作为单个查询执行速度较慢,但分两步执行时只需几秒钟

Oracle 一种查询,作为单个查询执行速度较慢,但分两步执行时只需几秒钟,oracle,oracle10g,Oracle,Oracle10g,我在ORACLE数据库中有两个视图: The view USERS with columns: UserId | GroupId | Details 如果每个用户有一个记录,则总数为40000,每个组中大约有1-30个用户 及 其中每个用户有一条记录 摘要视图非常复杂,但当我基于用户查询它时,它仍然非常快。 即: 在0.1秒内执行 USERS视图非常简单(它是所有USERS\u TYPE1和USERS\u TYPE2表的联合) 以及以下类型的查询: select * from USERS wh

我在ORACLE数据库中有两个视图:

The view USERS with columns:
UserId | GroupId | Details
如果每个用户有一个记录,则总数为40000,每个组中大约有1-30个用户

其中每个用户有一条记录

摘要视图非常复杂,但当我基于用户查询它时,它仍然非常快。 即:

在0.1秒内执行

USERS视图非常简单(它是所有USERS\u TYPE1和USERS\u 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秒的糟糕性能-尽管组中只有3个用户

如果首先找到用户ID,然后使用这些用户ID查询汇总表,则这应该只需要几分之一秒。 有什么方法可以提示DB这样做吗

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


((这很难用简单的方式重现,因为复杂视图有很多底层表。我有几个版本的摘要视图。在某些情况下(取决于摘要的构建方式),当我具体化用户视图时,它不再可怕,但在其他情况下它不会。)

视图上的视图…最好避免,或者处理得非常(非常)小心。巨大的性能问题,这是一个复杂的问题,但以下是一些基本信息:


你可以试试

  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
这将强制它首先计算内联视图

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