0

ローカルホストで実行されるクエリを使用してストアドプロシージャを作成しました。

0,0065s(0,1426s)でフェッチされた21行

そしてサーバー上:

0,0037秒(15,9947秒)で21行がフェッチされました

ローカルホストでサーバーと同じ結果を得るために、次のオプションを試しました。

  • SQL_NO_CACHE
  • キャッシュをリセットする
  • キャッシュのフラッシュ

しかし、同じ結果が得られないので、サーバーで実行されているクエリがそれほど遅いのはなぜだろうと思います。

Explainを実行しましたが、それから何を準備できるか本当にわかりません。

1, 'PRIMARY', '<derived2>', 'ALL', '', '', '', '', 16106, 100.00, 'Using temporary; Using filesort'
1, 'PRIMARY', 'A', 'ALL', 'PRIMARY', '', '', '', 5214, 100.00, 'Using where; Using join buffer'
2, 'DERIVED', 'T', 'ALL', 'PRIMARY', '', '', '', 76211, 100.00, 'Using wher

e '

そして、これは私が実行しているクエリです:

SELECT
        `A`.`country_description`,
    SUM(`turnover_ytd`) AS `turnover_currentyear_ytd`,
    SUM(`turnover_ly`) AS `turnover_lastyear_ytd`,
    SUM(`turnover_sly`) AS `turnover_2ndlastyear_ytd`,
    SUM(`turnover_ytd`) AS `volume_currentyear_ytd`,
    SUM(`turnover_ly`) AS `volume_lastyear_ytd`,
    SUM(`turnover_sly`) AS `volume_2ndlastyear_ytd`,
    COALESCE(((SUM(`turnover_ytd`)-SUM(`turnover_ly`))/SUM(`turnover_ly`))*100, 0) AS `turnover_percentage_currentandlastyear_ytd`,
        COALESCE(((SUM(`volume_ytd`)-SUM(`volume_ly`))/SUM(`volume_ly`))*100, 0) AS `volume_percentage_currentandlastyear_ytd`,
        COALESCE(((SUM(`turnover_ly`)-SUM(`turnover_sly`))/SUM(`turnover_sly`))*100, 0) AS `turnover_percentage_lastand2ndlastyear_ytd`,
        COALESCE(((SUM(`volume_ly`)-SUM(`volume_sly`))/SUM(`volume_sly`))*100, 0) AS `volume_percentage_lastand2ndlastyear_ytd`


  FROM
        `agent` AS `A`
        INNER JOIN
        (
            SELECT
                `debtor_number`,
                IF(SUBSTR(`period`,1,4) = SUBSTR(201210,1,4), `turnover_ytd`, 0) AS `turnover_ytd`,
                IF(SUBSTR(`period`,1,4) = SUBSTR(201210-100,1,4), `turnover_ytd`, 0) AS `turnover_ly`,
        IF(SUBSTR(`period`,1,4) = SUBSTR(201210-200,1,4), `turnover_ytd`, 0) AS `turnover_sly`,
        IF(SUBSTR(`period`,1,4) = SUBSTR(201210,1,4), `volume_ytd`, 0) AS `volume_ytd`,
                IF(SUBSTR(`period`,1,4) = SUBSTR(201210-100,1,4), `volume_ytd`, 0) AS `volume_ly`,
        IF(SUBSTR(`period`,1,4) = SUBSTR(201210-200,1,4), `volume_ytd`, 0) AS `volume_sly`
            FROM
                `turnover_volume` AS `T`
            WHERE
        `company_number` = 01
      AND
        SUBSTR(`period`,5,2) <= SUBSTR(201210,5,2)
      AND
        SUBSTR(`period`,1,4) IN (SUBSTR(201210,1,4), SUBSTR(201210-100,1,4), SUBSTR(201210-200,1,4))
      AND
        `turnover_ytd` != 0
      AND
        `volume_ytd` != 0

    ) AS `T` ON (`T`.`debtor_number` = `A`.`debtor_number`)

    WHERE
    `A`.`agent_number` = 003
  GROUP BY
    `A`.`country_description`;

サーバーの仕様は次のとおりです。

ホストは、ESXが実行されている物理サーバーであり、WebサーバーはESX内でゲストとして仮想的に実行されています。

ホストの仕様は次のとおりです。

ブランドとタイプ:Altos R720 CPU:Xeon E5404(2ghz)ストレージ:Iscsiを介してストレージ経由で接続されています。(Eternus DX80)メモリ:6 GB

ゲストスペックは次のとおりです。CPU:2x vCPUメモリ:2 GB

OSは次のとおりです。RedHat4.1.2-44

これらの仕様とは別に、ゲストはホストに無制限にアクセスできます。

私のローカルPCの仕様は次のとおりです。

CPU:Intel Core 2 Quad CPU Q9300 @ 2.50GHzメモリ:3 GB OS:Windows732ビット

助けていただければ幸いです。

4

2 に答える 2

0

ローカルマシンと比較してサーバーのハードウェアを検討しましたか?

これは共有ホスティングパッケージですか?専用サーバー?雲?

于 2012-10-15T08:53:18.537 に答える
0

私は問題を発見しました。どういうわけか、ローカルホストデータベースと比較してWebサーバー上で照合タイプが異なります。

ローカルホストで私は持っています:

latin1_swedish_ci

サーバー上では次のようになりました。

utf8_unicode_ci

また、テーブルのエンジンは異なり、サーバー上のInnoDBとMyIsamは異なります...

これにより、異なる照合タイプ間の変換を確認することにより、クエリが大幅に遅くなりました。

于 2012-10-17T15:13:34.393 に答える