2

このようなクエリでは:

SELECT 
AVG(var1) AS var1_average,
AVG(var2) AS var2_average,
(
 AVG(var1) + 
 AVG(var2)
)/2.0 AS total_average
FROM readings

複数回出現するAVG(var1)のようなステートメントは複数回実行されますか、それともより効率的に内部にキャッシュされますか?

私の質問は、パフォーマンス/効率を理解しようとすることから来ています。サブクエリとして書いた方が良いのでしょうか? それはどれほど大きな違いを生むでしょうか?

4

2 に答える 2

3

これは最適化の非常に難解な領域であり、一般的な部分式の最適化です。あなたの例では、ほとんど違いはありません。はgroup byデータを並べ替えますが、これは平均を行うよりもはるかにコストがかかります。

など、count(distinct)より高価な他の計算があります。その場合、あなたの質問はより明白になります。

サブクエリと比較するスティーブンのソリューションは、おそらくこの場合には十分に機能します。ただし、サブクエリは一時テーブルを作成するため、それ自体に多くのオーバーヘッドが発生します。したがって、リンゴとリンゴを比較していません。

本当に違いを比較したい場合は、次の比較を行ってください。クエリを比較します。

SELECT AVG(var1) AS var1_average, AVG(var2) AS var2_average,
       (AVG(var1) + AVG(var2))/2.0 AS total_average
FROM readings;

に:

SELECT AVG(var1) AS var1_average, AVG(var2) AS var2_average
FROM readings;

ほぼ同じ時間がかかることに気付くでしょう。そうでない場合は、サブクエリ アプローチを使用できる可能性があります。または、アプリケーション レベルで平均計算を行うこともできます。

于 2013-07-04T13:57:48.343 に答える
1

以下の実行時間を比較してみてください。

SELECT 
AVG(var1) AS var1_average,
AVG(var2) AS var2_average,
(
 AVG(var1) + 
 AVG(var2)
)/2.0 AS total_average
FROM readings

と:

SELECT
    (var1_average+var2_average)/2.0 AS total_average
    var1_average,
    var2_average
FROM (
    SELECT 
        AVG(var1) AS var1_average,
        AVG(var2) AS var2_average
    FROM readings
) as tmp

それらを複数回実行しSQL_NO_CACHE、意味のある結果を得るために追加してください。

注: mysql が一時テーブルを作成するため、2 番目のクエリのオーバーヘッドはわずかですが、テーブルに多数のレコードがある場合は関係ありませんreadings

于 2013-07-04T13:45:17.123 に答える