MYSQL запрос работает нормально в AWS экземплярах RDS с 1 виртуальным ЦП, но зависает при выполнении в экземплярах с 2 виртуальными ЦП или более - PullRequest
1 голос
/ 04 апреля 2020

У меня следующий SQL запрос, выполненный ниже в функции Lambda с кодом Phython. Лямбда-функция подключена к AWS RDS, работающему MySQL 5.7.22.

Когда этот запрос выполняется для типа экземпляра db.t2.small или db.t2.micro, запрос работает нормально, и результаты возвращаются через несколько секунд. Эти типы экземпляров имеют 1 vCPU

Однако, когда мы поднимаем тип экземпляра до db.t3.small или db.t3.medium, который имеет 2 vCPU, запрос зависает до времени ожидания лямбда (около 10 минут) , Даже после истечения времени ожидания лямбда-функции процессор БД остается на 50% потребляемой в течение самого длительного времени, пока я не решил перезагрузить RDS.

Это противоречит интуиции, так как я думаю, что наличие большего количества vCPU должно улучшить производительность. Я предполагаю, что это может быть связано с многопоточностью, но не может найти какую-либо информацию. Надеюсь получить помощь / подсказки здесь.

Вот запрос SQL

INSERT INTO
   CP58 (
   SELECT
      s.BRN, IFNULL(IFNULL((
      SELECT
         rtmp.DLR_CODE 
      FROM
         STABLE stmp, CP58_REPORT rtmp 
      WHERE
         stmp.DLR_CODE = rtmp.DLR_CODE 
         AND s.BRN = rtmp.BRN 
         AND stmp.HQ_FLAG = 'HQ' 
         AND stmp.STATUS = 'Active' 
      GROUP BY
         stmp.COMP_REGNO, rtmp.DLR_CODE 
      ORDER BY
         stmp.COMP_REGNO, SUM(rtmp.TOTAL) DESC LIMIT 1), 
         (
            SELECT
               rtmp.DLR_CODE 
            FROM
               STABLE stmp,
               CP58_REPORT rtmp 
            WHERE
               stmp.DLR_CODE = rtmp.DLR_CODE 
               AND s.BRN = rtmp.BRN 
               AND stmp.HQ_FLAG = 'HQ' 
            GROUP BY
               stmp.COMP_REGNO,
               rtmp.DLR_CODE 
            ORDER BY
               stmp.COMP_REGNO,
               SUM(rtmp.TOTAL) DESC LIMIT 1
         )
), 'NOHQDEALERCODE') as 'HQDEALERCODE', s.DEALERNAME, s.ADDRESS, IFNULL(MAX(x.CPTABLE_YEAR), MAX(y.EDTABLE_YEAR)) as 'YEAR', IFNULL(SUM(x.CPTABLE), 0) as 'CPTABLE_TOTAL', IFNULL(SUM(y.EDTABLE), 0) as 'EDTABLE_TOTAL', 
         (
            IFNULL(SUM(x.CPTABLE), 0) + IFNULL(SUM(y.EDTABLE), 0)
         )
         as 'TOTAL', '0' as 'PDF' 
      FROM
         (
            SELECT
               stmp.COMP_REGNO as 'BRN',
               stmp.DLR_CODE as 'DLR_CODE',
               stmp.DLR_NAME as 'DEALERNAME',
               CONCAT(stmp.ADDRESS, ' ', stmp.TOWN, ' ', stmp.POSTCODE, ' ', stmp.STATE) as 'ADDRESS' 
            from
               STABLE stmp 
            GROUP BY
               DLR_CODE
         )
         s 
         LEFT OUTER JOIN
            (
               SELECT
                  subqc.DESTDEALERCODE as 'DEALERCODE',
                  SUM(subqc.RM) as 'CPTABLE',
                  YEAR(subqc.DATETIME) as 'CPTABLE_YEAR' 
               FROM
                  CPTABLE subqc 
               GROUP BY
                  subqc.DESTDEALERCODE
            )
            x 
            on x.DEALERCODE = s.DLR_CODE 
         LEFT OUTER JOIN
            (
               SELECT
                  subsubqe.DEALERCODE as 'DEALERCODE',
                  SUM(subsubqe.AMOUNT) as 'EDTABLE',
                  YEAR(subsubqe.BANKACK_DATE) as 'EDTABLE_YEAR' 
               FROM
                  EDTABLE subsubqe 
               GROUP BY
                  subsubqe.DEALERCODE
            )
            y 
            on s.DLR_CODE = y.DEALERCODE 
      GROUP BY
         BRN 
      HAVING
         TOTAL > 0 
         AND HQDEALERCODE <> 'NOHQDEALERCODE')
...