2016-07-11 6 views
0

テーブル/レールモデルで最も最近作成されたレコードを見つける必要があり、効率的に処理したいと思います。私の主キーはUUIDなので、Rails Samples.lastメソッドを使用することはできません。これを求めるグーグルでは、トップのRailsの答えはsort ordered in descending order with a limit of 1です。もちろん、これは唯一の方法ではありません。数年前にデータベースクラスを取得したとき、私たちは頻繁にこのようなことを左外部結合で行いました。最新のレコードの検索:左外部ジョインと降順のソート

私は両方の方法をSQLServerで試しましたが、私は説明に精通しておらず、どちらが良いかわからないのです。私は試しました:

SELECT TOP 1 * FROM samples ORDER BY created_at DESC; 

この説明では、クラスタード・インデックス・スキャンを使用するソートが示されました。

SELECT * FROM samples s1 
LEFT OUTER JOIN samples s2 ON s1.created_at < s2.created_at 
WHERE s2.user_id IS NULL; 

2つのクラスタード・インデックス・スキャンを使用してネストされたループを持つフィルターを示しています。

これらのうち、どちらが優れているのか、それともどちらが匹敵しますか?それとも、私が使用すべき別の方法がありますか?並べ替えのバージョンがわかりやすくなっているので、私の傾向は私の好みです(私のチームの他の開発者は、SQLやデータベースについて私が気づいているほど少ないと知っています)が、これは大きなテーブルで使用されるので効率的でなければなりません。

また、SQL Serverを使用することは重要ですが、私もMySQLデータベースを使用していますので、可能であれば、データベースに依存しない回答を期待しています。

+0

まあTOPはとらわれない – Strawberry

+0

ではありません、私はそれを承知しています。 MySQLでは、それは明らかに制限を使用して書き換えられます。 – Maltiriel

+0

それは私には分かりません;-) – Strawberry

答えて

1

Finder Methods: Lastは、あなたのidカラムがインデックスを持っていると仮定すると、主キーであること、あなたが安全に、最新のレコードが最高のID番号を持つものであろうと仮定だろうか?

クエリは次のようになります。

SELECT * FROM samples ORDER BY id DESC LIMIT 1; 

それとも、あなたはあなたのためにそれを行うことになる、Sample.lastを使用することができます。

編集:あなたのiduuidあるので

、私は、フルテーブルスキャンを避けるために、created_at列にインデックスを追加することをお勧めします。次に、あなたの人生を容易にするために、あなたはあなたのモデルに以下のスコープを追加することができます。

scope :first, -> { order("created_at").first } 
scope :last, -> { order("created_at DESC").first } 

は、この情報がお役に立てば幸い!

+1

http://stackoverflow.com/questions/9780169/active-record-model-find-lastこれは、主キーの整数を前提としています。私はUUIDです。私はこの事実を反映するために質問を編集します。 – Maltiriel

+0

@Maltiriel私は答えを更新しました。 –

+0

質問は "私はどのようにこれをRailsで行うことができますか"ではありません。私はすでにそれを行う方法を知っています。問題は「最も効率的な方法は何か」です。基本的なRailsのやり方では必ずしも最も効率的なデータベースクエリが得られるわけではありません。 – Maltiriel

0

Ruby on Railsを使用しているので、Sample.lastを試してみましたか?

あなたがここで詳細を読むことができます:(?)

+0

http://stackoverflow.com/questions/9780169/active-record-model-find-last私の主キーはUUIDなので、これはうまくいきません。 – Maltiriel

0

は、私はあなたがすることができると思う:

Sample.order(created_at: :desc).first 
関連する問題