2

50-100k 行のテーブルがあります。自動インクリメント ID フィールドと、Main_Port という別のフィールドがあります。

Main_Port = x の最後の ID を選択したい。そして、効率化を図りたい。

私が今使っているのは:

SELECT max(MANIFEST_ID)FROM MANIFEST_MSS.dbo.Manifest where Main_Port = x

これが最善の方法ですか?

テーブルは 50 万行以上に増加する可能性があります

4

5 に答える 5

3

データ構造とインデックス構造について詳しく知らなければ、「これは効率的です。使用するクエリは次のとおりです。

SELECT max(MANIFEST_ID)
FROM   MANIFEST_MSS.dbo.Manifest 
WHERE  Main_Port = x

...に応じて、非常に効率的である可能性があります。

  • Manifest.MainPort にインデックスはありますか? または (Manifest.MainPort, ManifestID desc) ?
  • Main_Port で話しているのは、どのような種類の密度ですか? つまり、特定の main_port に対して、個別のマニフェスト ID はいくつあるでしょうか?

いくつかの観点を追加すると、500k 行はデータベース用語ではそれほど大きくありません。ここでクエリのいくつかのバリエーションを見てきましたが、そのうちの 1 つは別のものよりわずかに速いかもしれませんが、実際の速度は適切なインデックス (Main_Port、ManifestID desc) を持つことになります。または、本当に深く掘り下げたい場合は、概要ビューを具体化する必要があります。ここでは、具体化されたビューの仕組みについての適切な説明を示します。

于 2012-05-10T12:56:19.427 に答える
2
SELECT MANIFEST_ID FROM MANIFEST_MSS.dbo.Manifest where Main_Port = x ORDER BY MANIFEST_ID DESC LIMIT 1

逆のようですが、あなたよりも効率的かどうかはわかりません

于 2012-05-10T12:55:50.313 に答える
2

MAX を使用しても問題ありませんが、必要に応じて Order By を使用してそれを行うことができます。

SELECT MANIFEST_ID FROM MANIFEST_MSS.dbo.Manifest where Main_Port = x ORDER BY MANIFEST_ID DESC LIMIT 1
于 2012-05-10T12:55:51.860 に答える
2

MAX は最後ではなく、より大きな値を提供します。そして、より大きな値を取得するためにすべての行をスキャンする必要があるため、これは悪いことです。

私はこれを行います:

SELECT *
FROM MANIFEST_MSS.dbo.Manifest
where Main_Port = x limit 1
order by ID desc
于 2012-05-10T12:56:43.773 に答える
1

Manifest_ID 列が自動インクリメント列である場合、以下のクエリも達成できます。

 SELECT TOP 1 MANIFEST_ID FROM MANIFEST_MSS.dbo.Manifest WHERE Main_Port = X order by    MANIFEST_ID DESC
于 2012-05-10T12:56:56.240 に答える