0

MySQL は、定義された関数の決定論を知る必要があります。公式ドキュメントには次のように記載されています。

いくつかの特性は、ルーチンによるデータ使用の性質に関する情報を提供します。MySQL では、これらの特性は単なるアドバイスです。

それは、関数の決定論が関数の実行方法に影響しないことを意味しますか?

4

3 に答える 3

0

sirideの答えは、これに関するWeb上のどこでも見つけることができる最も多くの議論です。しかし、DETERMINISTIC を MODIFIES SQL DATA と組み合わせるとどうなるでしょうか。また、クエリは特定の日には決定論的であるかもしれませんが、日の間ではそうではありません (たとえば、めったに変更されないルックアップ テーブルに基づいています)。

これに関する私の意見では、(a) 関数が実際に数学的に決定論的である (例: 入力 * 2 を返す) か、または

(b) パフォーマンスの問題があり、速度を上げるために DETERMINISTIC を試す必要があります。

そうでなければ、オプティマイザーが何をするかについての私たちの誤解に基づいて間違った結果を提供する危険を冒す必要はありません。

于 2015-06-16T23:38:47.257 に答える
0

推測するなら、MySQL は DETERMINISTIC 関数を真の参照整合性を持つものとして扱うと言えます。したがって、関数が同じ引数で呼び出された場合、常に同じ結果が得られます。この結果、関数が同じ引数で複数回呼び出される場合、MySQL は実行の順序を変更して、一度だけ呼び出されるようにするか、結果をキャッシュすることを選択する可能性があります。決定論的関数を最適化するときに MySQL が正確に何を行うかについて、Google で多くを見つけることはできませんが、それが私が指定したもの以外のものであるとは思えません。

If you mark a function as DETERMINISTIC, and it is not, then MySQL might not call it when it should, resulting in potentially incorrect results. For example, if calling it with the value '3' might produce a result of '7' one time and then '8' later on, then you might get '7' both times if MySQL thinks it's DETERMINISTIC.

いずれにせよ、関数が真に決定論的である (つまり、副作用がなく、渡されたもの以外のデータを読み取らない) 場合、DETERMINISTIC とマークしても問題はなく、オプティマイザが実行の順序を変更したり、呼び出しの数を減らしたりするのに十分なほどスマートです。関数がデータの読み取りまたは変更を行う場合、またはその他の副作用がある場合は、DETERMINISTIC とマークしないことで確実に安全になります。また、DETERMINISTIC とマークすることで問題が発生する可能性があります。MySQL が誤った結果につながる実行計画を選択する可能性があるためです。関数から来ています。つまり、MySQL に嘘をつかないでください。

于 2012-12-03T02:08:09.280 に答える
0

私へのその文は、それらがmysqlによって使用される可能性があることを意味しますが、mysqlもそうではない可能性があります。

「決定論的」を使用することをお勧めしますが、クエリ実行戦略が期待どおりかどうかを実際に測定する必要があります。

于 2012-12-03T01:23:02.123 に答える