如果查询经常以短时间间隔(例如每5秒)发送到数据库,那么生成的读取数量是否会导致性能或可用性方面的问题?如果数据库是Oracle,那么可以使用任何技巧来避免性能损失吗?如果查询来自应用程序,是否有办法通过软件设计减少任何影响?
答案 0 :(得分:3)
除非您的查询非常密集或写得非常糟糕,否则每隔几秒钟就不会出现任何明显的问题。对于通常以毫秒为单位的查询,这种情况并不常见。
您可能仍然希望优化它,只是因为有更好的方法来实现它。在Oracle和ADO.NET中,您可以使用OracleDependency
作为第一次运行查询的命令,然后订阅其OnChange
事件,只要基础数据导致查询结果,就会自动调用该事件改变。
答案 1 :(得分:2)
这取决于查询。我假设您想要定期执行它的原因是因为返回的数据会经常更改。如果是这种情况,那么应用程序级缓存显然不是一种选择。
过去那个,这个查询在返回的行数,表连接,数据聚合/计算方面是“大”的吗?如果是这样,如果出现以下情况可能会出现问题:
您查询的速度超过了执行查询所需的速度。如果你每秒呼叫一次,但运行需要2秒,那就会成为一个问题。
如果查询涉及大量数据并且您有很多其他查询访问相同的表,则可能会遇到锁升级问题。
与大多数性能问题一样,唯一真正的答案是测试。在这种情况下,使用DB 和中的实际数据进行测试,将此查询与您在系统上预期的其他查询负载同时运行。
答案 2 :(得分:2)
根据Samuel的建议,Oracle在JDBC中提供了database change notification工具,以便您的应用程序可以订阅基础数据中的更改,而不是每隔几秒重新运行一次查询。如果数据的变化频率低于运行查询的频率,则这可能是一项主要的性能优势。
另一种选择是使用Oracle TimesTen作为中间层机器上数据的内存缓存。这将减少网络往返次数,并将通过一个非常优化的检索路径。
最后,我要看一下使用query result cache让Oracle缓存结果。