使用流水线功能微调oracle查询

时间:2014-02-20 19:31:33

标签: sql oracle oracle-apex database-performance pipelined-function

我有一个查询(提供Oracle Application Express报告)我的用户告诉我“慢慢地”或以不可接受的速度执行(没有给出页面的实际加载时间,查询是只有页面上的东西)。

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

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

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

受如何影响?:

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

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

    此外,这很复杂,因为我无法确定实际加载时间是什么,因为我们的用户没有报告该详细程度。

    任何想法:

    • 我如何确定此查询是否实际上很慢?
    • 平均处理时间是多少?
    • 如果出现问题,如何进行微调?

    谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

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

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