0

我有一个查询(支持 Oracle Application Express 报告),我们的用户告诉我执行“缓慢”或速度不可接受(没有给出页面的实际加载时间,查询是唯一的这页纸)。

该查询涉及许多表,实际上引用了一个流水线函数,该函数识别当前登录到我们网站的用户,并根据我们拥有的自定义安全方案返回他们有权访问的自定义“表”记录。

我的主要问题是关于 Oracle 的查询缓存以及它们如何受到我们设置的影响。

当我从网页中取出查询并在 Sql Developer 中运行它(并手动指定用户 ID 以模拟登录到网站的用户)时,性能从 71 秒到 19 秒到 0.5 秒。显然,Oracle 正在利用其缓存机制来加快后续运行速度。

这是如何受到影响的?:

  1. 事实上,不同的用户将从管道函数中获得不同的表(所有相同的列,只是不同的行数和行中的值)。管道内衬是否会阻止缓存工作?我只看到缓存是因为我正在运行一个非常孤立的测试吗?
  2. 更进一步——缓存是否容易受到使用系统的人数的影响?我不确定可以缓存多少“多少”。因此,如果我们有 50 个并发用户正在访问网站的不同部分并整天加载不同的查询,那么 oracle 是否可能无法缓存其中的许多/任何一个,因为它不断地看到不同的请求查询?

抱歉,我的问题不是很技术性。

我是一名开发人员,被要求帮助解决这个看似 DBA 的问题。

此外,这很复杂,因为我无法真正确定实际加载时间是多少,因为我们的用户没有报告那个详细程度。

任何想法:

  • 我如何确定这个查询是否真的很慢?
  • 平均处理时间是多少?
  • 如果出现问题,如何进行微调?

谢谢!

4

1 回答 1

1

听起来这与 APEX、流水线表函数或查询缓存没有任何关系。听起来您正在描述普通旧数据缓存的影响(最有可能在数据库级别,但可能在操作系统和磁盘子系统层)。

作为一个非常基本的概述,数据存储在行中,行存储在块中(最常见的大小为 8 kb),块存储在扩展区中(通常大小为几 MB),扩展区滚动到段(即表)。Oracle 维护一个缓冲区缓存,其中存储了最近访问的块。当您运行查询时,Oracle 会计算出它需要读取哪些块才能获取您的数据(这是查询计划)。然后它会查看这些块是否在缓冲区高速缓存中,或者是否必须从磁盘读取它们。显然,从缓存中读取块比从磁盘中读取要高效得多,因为 RAM 比磁盘快得多。如果您连续多次使用同一组绑定变量值运行相同的查询,您将 每次都会访问相同的块集,但越来越多的你关心的块将在缓存中。因此,您通常会期望在第二次和第三次调用查询时,您会看到更快的性能。

如果您使用一组不同的绑定变量值运行查询,如果第二组绑定变量值导致 Oracle 访问许多相同的块,则这些执行将受益于先前测试缓存的数据。否则,您将回到第 1 格,可能会从磁盘读取您需要的所有数据。最有可能的是,您会看到两者的某种组合。

还要记住,缓存数据的不仅仅是 Oracle。通常,操作系统会缓存底层 Oracle 数据文件中最活跃的部分。I/O 子系统也将缓存最近访问的数据。因此,即使 Oracle 认为它需要取出一个块,因为它不在数据库的缓冲区缓存中,文件系统或 I/O 子系统可能已经缓存了该数据,因此它可能不需要实际的物理读取磁盘。这些其他缓存的行为相似,在一行中多次运行相同的查询可能会导致缓存“温暖”并提高以后运行的性能。

于 2014-02-20T20:01:05.247 回答