50-100k 行のテーブルがあります。自動インクリメント ID フィールドと、Main_Port という別のフィールドがあります。
Main_Port = x の最後の ID を選択したい。そして、効率化を図りたい。
私が今使っているのは:
SELECT max(MANIFEST_ID)FROM MANIFEST_MSS.dbo.Manifest where Main_Port = x
これが最善の方法ですか?
テーブルは 50 万行以上に増加する可能性があります
データ構造とインデックス構造について詳しく知らなければ、「これは効率的です。使用するクエリは次のとおりです。
SELECT max(MANIFEST_ID)
FROM MANIFEST_MSS.dbo.Manifest
WHERE Main_Port = x
...に応じて、非常に効率的である可能性があります。
いくつかの観点を追加すると、500k 行はデータベース用語ではそれほど大きくありません。ここでクエリのいくつかのバリエーションを見てきましたが、そのうちの 1 つは別のものよりわずかに速いかもしれませんが、実際の速度は適切なインデックス (Main_Port、ManifestID desc) を持つことになります。または、本当に深く掘り下げたい場合は、概要ビューを具体化する必要があります。ここでは、具体化されたビューの仕組みについての適切な説明を示します。
SELECT MANIFEST_ID FROM MANIFEST_MSS.dbo.Manifest where Main_Port = x ORDER BY MANIFEST_ID DESC LIMIT 1
逆のようですが、あなたよりも効率的かどうかはわかりません
MAX を使用しても問題ありませんが、必要に応じて Order By を使用してそれを行うことができます。
SELECT MANIFEST_ID FROM MANIFEST_MSS.dbo.Manifest where Main_Port = x ORDER BY MANIFEST_ID DESC LIMIT 1
MAX は最後ではなく、より大きな値を提供します。そして、より大きな値を取得するためにすべての行をスキャンする必要があるため、これは悪いことです。
私はこれを行います:
SELECT *
FROM MANIFEST_MSS.dbo.Manifest
where Main_Port = x limit 1
order by ID desc
Manifest_ID 列が自動インクリメント列である場合、以下のクエリも達成できます。
SELECT TOP 1 MANIFEST_ID FROM MANIFEST_MSS.dbo.Manifest WHERE Main_Port = X order by MANIFEST_ID DESC