SAS PROC SQL:如何在测试之间清除缓存

SAS PROC SQL: How to clear cache between testing

我正在阅读这篇论文:"Need for Speed - Boost Performance in Data Processing with SAS/Access® Interface to Oracle"。我想知道如何清除 SAS 中的缓存/缓冲区,以便我的重复查询/测试能够准确反映更改?

我注意到相同的查询 运行 第一次需要 10 秒,并且(不)更改 运行 之后将花费更短的时间(比如 1-2 秒)。是否有清除缓存/缓冲区的命令/指令。这样我就可以对我的新更改进行干净的测试。

我正在使用 SAS Enterprise Guide 处理托管在 Oracle 服务器上的数据。谢谢!

我不是 Oracle 专家,但我怀疑您有什么方法可以 'clear' oracle 缓存(如果有的话,您可能需要成为 DBA 才能这样做)。

通常我所做的是稍微更改查询的参数,以便确切的查询不再匹配缓存中的任何内容。例如,您可以更改要查询的日期范围。

它不会为您提供准确的性能比较(因为您得到了不同的结果),但如果一个查询的性能明显优于另一个,它会给您一个很好的主意。

为了刷新 Oracle 端的缓存,您需要 DBA 权限(在 Oracle 中达到 运行 alter system flush buffer_cache;)和 OS 级访问权限(刷新 OS' 缓冲区缓存 - echo 3 > /proc/sys/vm/drop_caches 在 Linux 下的通用文件系统上。

如果您运行针对生产数据库,您可能没有这些权限——无论如何您都不想运行在生产数据库上执行这些命令,因为它会降低数据库所有用户的性能,并且其他查询会影响 运行 你的查询所花费的时间。

与其尝试准确测量 运行 您的查询所花费的时间,我建议您关注 如何 执行查询:

  • 它的哪一部分是 'pushed down' 到数据库的,有多少数据在 SAS 和 Oracle 之间流动
  • Oracle 的 explain plan 查询是什么 -- 它是否有明显的低效率

当以明显次优的方式执行查询时,您会发现(通常)固定版本在使用冷缓存和热缓存时都会 运行 更快。

要将此应用于您提到的情况(10 秒对 2 秒)- 在考虑如何准确测量之前,请先查看

  • 如果您的查询被正确地推送到 Oracle(可能会),
  • 以及它是否需要对足够大的 table 进行完整 table(分区)扫描(取决于数据库中的 IO 有多慢 - 大约 1-10 GB) .

如果您发现查询需要读取 1 GB 的数据并且您的典型(数据库内)读取速度为 100MB/s,那么使用冷缓存的 10 秒是 运行 的预期时间。