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



我正在阅读这篇论文:"使用SAS/Access®与Oracle的接口在数据处理中提高速度的需要"。我想知道如何清除SAS中的缓存/缓冲区,这样我重复的查询/测试就能准确地反映变化吗?

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

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

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

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

与其试图准确测量运行查询所需的时间,我建议您注意查询是如何执行的:

  • 它的哪一部分被"下推"到数据库,以及SAS和Oracle之间有多少数据流
  • Oracle对查询的explain plan是什么?它是否明显效率低下

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

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

  • 如果您的查询被正确地推送到Oracle(可能是这样)
  • 以及它是否需要对足够大的表进行完整的表(分区)扫描(取决于数据库中IO的速度——大约为1-10 GB)

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

我不是Oracle专家,但我怀疑是否有任何方法可以"清除"Oracle缓存(如果有,你可能需要成为DBA才能做到这一点)。

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

它不会给你一个确切的性能比较(因为你得到的结果不同),但如果一个查询的性能明显好于另一个查询,它会给你带来一个很好的想法。

最新更新