2017-02-10 7 views
0

同じデータで以下の手順を2つのバージョンのMySQLで実行しています。 私は "show full processlist"を実行します。 私が見る唯一の違いは、MySQLバージョン5.5.15が以下のようにすべてのSELECTに対してNAME_CONSTとCOLLATEを生成することです。 両方のDBの文字セットはlatin1です。NAME_CONSTのMySQLのプロシージャのパフォーマンスの問題

DECLAREプロシージャサンプル() BEGIN DECLARE A_Val int; DECLARE B_Val varchar(50);

DECLARE ApplCursor CURSOR FOR 
    SELECT A, CONVERT(B, CHAR(50)) 
    FROM SampleTable; 


OPEN ApplCursor; 

Cursor_Loop: LOOP 
    FETCH ApplCursor INTO A_Val, B_Val; 

    SELECT B_Val, X_Val FROM SomeTableX; 

END LOOP Cursor_Loop; 

CLOSE ApplCursor; 

END;

MySQLバージョン毎ため= 5.5.15 はMySQLはNAME_CONSTとCOLLATEを生成選択し、

選択NAME_CONST下に見られるように( 'B_Val'、_ latin1'A12345' COLLATE 'latin1_swedish_ci')、SomeTableXからX_Val 。

MySQLのバージョン= 5.7.16 同じSQLが出NAME_CONSTとCOLLATEとはるかに速くexecuesで生成され

SomeTableXからB_Val、X_Valを選択します。

誰かがNAME_CONSTとCOLLATEの生成を無効にする方法を提案できますか? これらのNAME_CONSTとCOLLATEの生成を停止するようにMySQLに指示する方法はありますか?

+0

なぜ、1つのMySQLバージョンが他のものより高速かもしれないのか、野生の推測:過去5年間にいくつかの技術的改善がありました。とにかく、あなたのコードは何をすべきですか?あなたの現在の手順はそれほど意味がありませんか、それともテストケースを持つだけですか?同じテストをしたいかもしれませんが、変数の代わりにテーブルから2列を選択してください(たとえば、 'select x_val、sometablexからx_valを選んでください)、それがまだ遅いかどうかを確認してください。 – Solarflare

答えて

0

したがってSHOW CREATE PROCEDURE両方のサーバーにあります。あなたはおそらくそれらが異なったCHARACTER SETおよび/またはCOLLATIONで造られたことを見るでしょう。

+0

これは非常に便利な情報です。Rick。しかし、プロシージャのCHARACTER SETとCOLLATIONを設定する方法はありますか? –

+0

あなたの接続のためにそれらを設定し、SPを 'DROP'して再作成し、' SHOW CREATE ... 'でチェックしてください。 –

関連する問題