Skip to content

Commit 016eefa

Browse files
authored
Remove Query.exclude(:order_by) in exists? (#4692)
`select(1)` with `limit(1)` is sufficient for databases to optimize away the order_by. In some cases removing the `order_by` clause will change the query-plan leading to seq-scans instead of index usage.
1 parent 36c6804 commit 016eefa

File tree

2 files changed

+2
-3
lines changed

2 files changed

+2
-3
lines changed

lib/ecto/repo/queryable.ex

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,6 @@ defmodule Ecto.Repo.Queryable do
142142
queryable =
143143
Query.exclude(queryable, :select)
144144
|> Query.exclude(:preload)
145-
|> Query.exclude(:order_by)
146145
|> Query.exclude(:distinct)
147146
|> Query.select(1)
148147
|> Query.limit(1)

test/ecto/repo_test.exs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -543,12 +543,12 @@ defmodule Ecto.RepoTest do
543543
"#Ecto.Query<from m0 in Ecto.RepoTest.MySchema, limit: 1, select: 1>"
544544
end
545545

546-
test "removes order by from query without distinct/limit/offset" do
546+
test "keeps order by from query" do
547547
from(MySchema, order_by: :id) |> TestRepo.exists?()
548548
assert_received {:all, query}
549549

550550
assert inspect(query) ==
551-
"#Ecto.Query<from m0 in Ecto.RepoTest.MySchema, limit: 1, select: 1>"
551+
"#Ecto.Query<from m0 in Ecto.RepoTest.MySchema, order_by: [asc: m0.id], limit: 1, select: 1>"
552552
end
553553

554554
test "overrides any select" do

0 commit comments

Comments
 (0)