5

クエリにSELECT句またはWHERE句のUDFへの呼び出しが含まれていると、MySQLクエリの実行時間が急激に低下することに気づきました。問題のUDFは、ローカルテーブルにクエリを実行してスカラー値を返します。したがって、UDFは算術式を実行するだけでなく、相関サブクエリとして機能します。UDFを削除し、相関サブクエリ、より複雑な結合などで書き換えるだけで、パフォーマンスの問題を修正しました。

MySQLの経験しかない場合は、これを現実として受け入れ、UDFの使用を調整して先に進むと思います。しかし、MySQLを使用する前は、SQLServerで5年以上働いていました。私は、はるかに大きなデータセットを処理し、スカラーとテーブル値の両方のユーザー定義関数に非常に大きく依存する課金システムを構築しました。これらのUDFは、クエリも実行しました(つまり、算術演算だけではありません)。SQL Serverでユーザー定義関数を使用するときに、この種のパフォーマンスの低下は発生しませんでした。

私が疑問に思っているのは、SQL ServerとMySQLの内部を十分に理解していて、2つのシステムでのUDFのこのパフォーマンスの違いの原因に関する私の現在の理論を確認または説明できる人がいるかどうかです。私の理論では、SQLServerのオプティマイザーはUDFをMySQLとは異なる方法で評価します。おそらく、MySQLでテーブルエンジンが分離されているためですか?あるいは、SQL ServerでのUDFの使用がより普及していて、MySQLエンジンのオプティマイザーがまだ進化していないのではないでしょうか。私が考えているのは、SQL Serverオプティマイザーが含まれているUDFを(可能な場合は)周囲のクエリの一部として扱い、残りのクエリと一緒に最適化することです。たぶん私はここでマークから外れていますが、SQLServerでUDFを使用することでこの種のパフォーマンスが低下するのを見たことがありません。

他の人がこの問題に当てることができるどんな光でもありがたいです。

4

2 に答える 2

2

UDFには既知の制限と問題があります。参照してください:UDFはSQL Serverのパフォーマンスに有害ですか?

このトピックに関する多くの記事があります。うまくいけば、これは非加入者アクセスです:UDF服の行ごとの操作に注意してください

于 2009-08-05T02:10:12.717 に答える
2

これは古い質問ですが、Googleで「MySQLUDFのパフォーマンス」を検索すると最初に表示され、まだ適切な回答がありません。受け入れられた回答の1つのリンクが壊れており、もう1つのリンクはMySQLUDFの詳細。

まず、実際のMySQLUDFについて話していることを確認しましょう。MySQLでは、「ストアド関数」とUDFが区別されます。ストアド関数は、内部のストアド関数/プロシージャインタープリターを使用して実行されます。UDFはC++で記述され、MySQLサーバーによってメモリにロードされる共有ライブラリにコンパイルされ、呼び出されると、CPU上でマシンコードとして実行されます。したがって、UDFのパフォーマンスは、多くの場合、格納されている関数のパフォーマンスよりも桁違いに優れています。

したがって、まず、実際のUDFについて話していることを確認してください。これは、ストアド関数ではありません。

次に、MySQL UDFのパフォーマンスは、実行しているアルゴリズムの性質と実装の品質に依存します。たとえば、UDFが1000バイトの長さの文字列の可能なすべてのトリプレット文字をテストしている場合、10億の組み合わせを調べ、1行あたり約数秒かかります。したがって、UDFを削除するとコードの実行が大幅に高速化する場合、次のステップはUDF自体をデバッグして、最適に記述されていることを確認することです。または、UDFが答えようとしている質問にすばやく答えることができない場合があります。

とは言うものの、比較的単純な質問に答える適切に記述されたUDFは、分析するデータを供給するために必要なI / Oと比較して、通常は非常に高速です。

于 2018-06-06T00:23:49.577 に答える