【问题标题】:Simultaneous queries on the same table / view affect performance同一张表/视图同时查询影响性能
【发布时间】:2015-07-19 03:58:00
【问题描述】:

如果我有一个包含数百万行的视图(或表),并且我从不同的会话执行这两个查询,一个查询是否会受到另一个查询的不利影响? (请注意不会进行 DML)

例如 Select * from t1 where sex = 'M'; (返回 20 列和 10,000 行) 从 t1 中选择性别,其中 rownum

如果我有多个会话执行查询 1 会怎样?直到其中一个被缓存(如果它足够大),它们都会同样慢吗?

我目前在负载平衡测试中为更快的查询执行类似查询时遇到性能下降,但是当单独执行时(即使结果没有被缓存)我得到“正常”的响应时间。

【问题讨论】:

    标签: sql oracle oracle11g sqlplus


    【解决方案1】:

    如果没有修改表并且查询正在使用基表,那么如果这两个查询相互干扰,那将是令人惊讶的。特别是第二个查询:

    select sex
    from t1
    where rownum < 2;
    

    应该只是获取一行并且速度非常快。

    第一个可以利用t1(sex)上的索引。

    如果t1 真的是一个视图,那么Oracle 可能必须为该视图做所有处理。两次,每个查询一次。如果视图很复杂,那么这会给服务器带来负担并减慢一切。

    【讨论】:

    • 该视图是几个较小表的连接,以创建“master_all_clients”视图。运行缓慢的查询并不像给出的示例那么简单,但是我看到 >2 秒的时间,当在负载平衡之外运行时,它们需要 0.1-0.2 秒。有没有办法加快这个过程?如果我创建了另一个视图,例如'view_for_slow_sql'(20 列)和另一个用于 'view_for_quick_sql'(2 列),都引用相同的基础表 - 这是否有帮助,还是仍然需要对表进行相同的共享块读取?
    【解决方案2】:

    您是否查看过缓冲区高速缓存中发生的情况,特别是缓冲区命中/未命中率的 V$DB_CACHE_ADVICE?是否有任何候选者(在基础表中)添加到“KEEP”缓冲区以避免 IO?公平地说,在决定采取什么行动之前,可能需要一段时间来监控并了解情况,但值得一看。更多信息在这里:https://docs.oracle.com/database/121/TGDBA/tune_buffer_cache.htm#TGDBA555

    【讨论】:

    • 我相信这些数据每 12 小时缓存到内存中,但是我认为正是这种“初始”缓存导致负载平衡对其他查询超时,但我不是 100 % 确定这是否是原因,或者实际上是否有可能是原因。
    • 那么,如果你在运行另一个查询之前刷新缓冲区,有什么不同吗?
    • 如何刷新缓冲区?我过去曾尝试过这样做,这在很大程度上源于一个事实。实际上很难做到可靠和b。由于它处于人工状态,因此实际上不会像现场环境一样。如果我必须缓存结果然后运行很好的测试,那么在每天两次缓存结果的期间,它必须是可接受的服务降级,但是我需要“知道”这是导致另一个的原因在我的测试中超时,并没有什么更严重的。
    猜你喜欢
    • 1970-01-01
    • 2010-10-06
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 2017-02-20
    • 1970-01-01
    • 2016-09-25
    相关资源
    最近更新 更多