クエリに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を使用することでこの種のパフォーマンスが低下するのを見たことがありません。
他の人がこの問題に当てることができるどんな光でもありがたいです。