0

15,000,000 レコードのテーブルがあります。これらのレコードは、特定の一致フィールドに基づいて相互に関連付けることができます (通常、1 つのグループで最大 3 つまたは 4 つ)。各レコードには日付も関連付けられていますが、この日付はテーブルにロードされた日付/順序と必ずしも相関しているわけではありません。

これらのレコードは、データベース内の他のレコードを更新するために定期的に使用されます。ただし、私は 1 つのグループの LATEST レコードだけに関心があり、1,500 万レコード (別の 1,000 万レコードを更新している) では、他のすべてを無視するようにしたいと考えています。また、最新のレコードに「更新済み」フラグが既にある場合は、更新をスキップしたいと考えています。

このようなビューを使用して、各グループ内の最新のレコードを収集しています。

SELECT a, b, c, max(scan.timestamp) AS latest_scan
FROM scan
GROUP BY a, b, c;

次にWHERE、my で句を使用UPDATEして、updated フラグを持つレコードを無視します。

これだけ多くのレコードがあるので、ビューを使用しても問題ありませんか? パフォーマンスを向上させるために実際のインデックス可能なテーブルをその場で作成し始める人を見てきましたが、それにはまだ時間がかかると感じています。これは私が恩恵を受けることができるものですか?

4

1 に答える 1

0

ほとんどの場合、それを試して、パフォーマンスがどのようなものかを確認する必要があります。

重要なことは、ビューが、オプティマイザ情報を提供するサブクエリの簡単な表記になることです。そのため、オプティマイザーがデータベースを呼び出す SQL ステートメントに使用するインデックスを見つけられるかどうかに大きく依存します。

ビューに ORDER BY を使用する必要はないことに注意してください。これは、レコードを並べ替えることができる他の SQL ステートメントで使用するためです。オプティマイザが順序をスキップできることを認識できない場合は、必要のないときに並べ替えに時間を費やすことになります。

グループの最大タイムスタンプを取得するには、GROUP BY a、b、c を使用できると思います。

于 2012-10-11T21:56:30.097 に答える