Sütunun endekslendiği varsayıldığında, aşağıdakilerin makul derecede verimli olması gerekir.
10 sıralı iki arayış ve sonra bir tür (en fazla) 20 geri döndü.
WITH CTE
AS ((SELECT TOP 10 *
FROM YourTable
WHERE YourCol > 32
ORDER BY YourCol ASC)
UNION ALL
(SELECT TOP 10 *
FROM YourTable
WHERE YourCol <= 32
ORDER BY YourCol DESC))
SELECT TOP 10 *
FROM CTE
ORDER BY ABS(YourCol - 32) ASC
(yani potansiyel olarak aşağıdaki gibi bir şey)
Veya başka bir olasılık (sıralanan satır sayısını maksimum 10'a düşürür)
WITH A
AS (SELECT TOP 10 *,
YourCol - 32 AS Diff
FROM YourTable
WHERE YourCol > 32
ORDER BY Diff ASC, YourCol ASC),
B
AS (SELECT TOP 10 *,
32 - YourCol AS Diff
FROM YourTable
WHERE YourCol <= 32
ORDER BY YourCol DESC),
AB
AS (SELECT *
FROM A
UNION ALL
SELECT *
FROM B)
SELECT TOP 10 *
FROM AB
ORDER BY Diff ASC
Not: Yukarıdaki yürütme planı basit tablo tanımı içindi
CREATE TABLE [dbo].[YourTable](
[YourCol] [int] NOT NULL CONSTRAINT [SomeIndex] PRIMARY KEY CLUSTERED
)
Teknik olarak, Diff tarafından sipariş edildiği gibi, alt daldaki Sıralama'ya da gerek duyulmamalıdır ve sipariş edilen iki sonucu birleştirmek mümkün olacaktır. Ama bu planı alamadım.
Sorgu ORDER BY Diff ASC, YourCol ASC
sadece değil ORDER BY YourCol ASC
, çünkü planın üst dalındaki Sırala'dan kurtulmak için çalışan şeydi. Ben ( YourCol
aynı Diff tüm değerleri için aynı olacak gibi sonucu hiç değişmeyecek olsa bile) ikincil sütun eklemek gerekiyordu, bu yüzden bir sıralama eklemeden birleştirme birleştirme (birleştirme) geçecekti.
SQL Server, artan sırada aranan X üzerindeki bir dizinin X + Y tarafından sıralanan satırları teslim edeceğini ve herhangi bir tür gerekli olmadığını çıkarabilir gibi görünüyor. Ancak, indeksi azalan sırada seyahat etmenin satırları YX ile aynı sırada (veya yalnızca tekli eksi X) ileteceğini çıkaramaz. Planın her iki dalı da bir sıralamayı önlemek için bir dizin kullanır, ancak TOP 10
alt dalda Diff
birleştirme için istenen sırayla elde etmek üzere (zaten bu sırada olmalarına rağmen) sıralanır.
Diğer sorgular / tablo tanımları için daha karmaşık olabilir veya bir çeşit planla birleştirme planını elde etmek mümkün olmayabilir - SQL Server'ın bir sipariş ifadesi bulmaya dayanır:
- Dizin aramasının belirtilen sırayı vereceğini kabul eder, böylece üst kısımdan önce sıralama gerekmez .
- Birleştirme işleminde kullanmaktan mutluluk duyar, bu nedenle
TOP
SELECT TOP 10 * FROM YourTable ORDER BY ABS(YourCol - 32) ;
basit kullanabiliriz . Verimli de değil.