SQL DB 性能和短时间重复查询
Posted
技术标签:
【中文标题】SQL DB 性能和短时间重复查询【英文标题】:SQL DB performance and repeated queries at short intervals 【发布时间】:2011-02-22 00:34:22 【问题描述】:如果以很短的时间间隔(比如每 5 秒)不断向数据库发送查询,生成的读取次数是否会导致性能或可用性方面的问题?如果数据库是 Oracle,是否有任何技巧可以用来避免性能下降?如果查询来自应用程序,是否有办法通过软件设计减少任何影响?
【问题讨论】:
这取决于查询及其读取次数、x 的值(间隔长度)以及硬件规格。也许你可以解释更多关于你的实际情况...... 阅读:akadia.com/services/ora_bind_variables.html @Mitch Wheat:间隔大约是 5-10 秒。检索到的信息将是一些用于绘制图形的统计信息,因此查询很可能跨越多个表。我没有关于硬件的信息。在最坏的情况下会有什么解决方案? @OMG 小马:感谢分享。会看看。 @James P.,每次调用查询时数据是否都会更改,或者数据更改的频率低于调用查询的频率?一个单独的电话需要多长时间?查询使用了多少资源? 【参考方案1】:除非您的查询非常密集或写得很糟糕,否则它不会导致每隔几秒运行一次的任何明显问题。对于通常以毫秒为单位的查询来说,这种情况并不常见。
不过,您可能仍想对其进行优化,只是因为有更好的方法可以做到这一点。在 Oracle 和 ADO.NET 中,您可以将OracleDependency
用于第一次运行查询的命令,然后订阅其OnChange
事件,只要基础数据导致查询结果发生更改,就会自动调用该事件。
【讨论】:
感谢您的回答塞缪尔。我很想知道是否存在与 OracleDependency 等效的 Java。我知道有 PreparedStatement,但这似乎不符合描述。 @James P.,抱歉,我不知道 Java 是否可以做到这一点,这只是在某些情况下(您想查询数据是否更改)提供帮助的示例。我们在我们的应用程序中有一个这样的查询,数据的变化比我们调用它的频率要低得多,使用通知是一个很大的变化。这取决于特定的应用程序和查询,尽管它是否有用(如果您盲目地对每个通知重新查询,它最终可能会更频繁地触发)。【参考方案2】:这取决于查询。我假设您要定期执行它的原因是因为返回的数据会经常更改。如果是这种情况,那么应用程序级缓存显然不是一种选择。
过去,这个查询在返回的行数、连接的表、聚合/计算的数据方面是否“大”?如果是这样,可能会出现以下问题:
您的查询速度快于执行查询所需的速度。如果你每秒调用一次,但运行需要 2 秒,那将成为一个问题。
如果查询涉及大量数据并且您有很多其他查询访问相同的表,则可能会遇到锁升级问题。
与大多数性能问题一样,唯一真正的答案是测试。在这种情况下,使用数据库中的真实数据进行测试并运行此查询,同时运行您期望系统上的其他查询负载。
【讨论】:
正确。我同意你的分析。正如 Samuel 所建议的,最好在真正开始测试之前推迟任何优化。【参考方案3】:按照 Samuel 的建议,Oracle 在 JDBC 中提供了执行database change notification 的功能,以便您的应用程序可以订阅基础数据的更改,而不是每隔几秒重新运行一次查询。如果数据更改的频率低于您运行查询的频率,这可能会带来主要的性能优势。
另一种选择是使用Oracle TimesTen 作为中间层机器上数据的内存缓存。这将减少网络往返,并将通过一个非常优化的检索路径。
最后,我想看看使用 query result cache 让 Oracle 缓存结果。
【讨论】:
以上是关于SQL DB 性能和短时间重复查询的主要内容,如果未能解决你的问题,请参考以下文章