たとえば、Oracleデータベースにmy_tableと呼ばれるテーブルがあります。ログテーブルの一種です。これには、「id」という名前の増分列と、登録ユーザーに固有の「registration_number」があります。今、登録ユーザーの最新の変更を取得したいので、このタスクを達成するために以下のクエリを書きました:
最初のバージョン:
SELECT t.*
FROM my_table t
WHERE t.id =
(SELECT MAX(id) FROM my_table t_m WHERE t_m.registration_number = t.registration_number
);
2 番目のバージョン:
SELECT t.*
FROM my_table t
INNER JOIN
( SELECT MAX(id) m_id FROM my_table GROUP BY registration_number
) t_m
ON t.id = t_m.m_id;
私の最初の質問は、上記のどのクエリが推奨されているのか、そしてその理由は何ですか? 2 つ目は、このテーブルに約 70.000 の挿入が行われる場合がありますが、ほとんどの場合、挿入される行の数は 0 から 2000 の間で変化します。このテーブルにインデックスを追加するのは合理的ですか?