Giả sử cột được lập chỉ mục sau đây sẽ có hiệu quả hợp lý.
Với hai lần tìm kiếm 10 hàng và sau đó một loại (tối đa) 20 được trả về.
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
(tức là có khả năng giống như bên dưới)
Hoặc một khả năng khác (làm giảm số lượng hàng được sắp xếp tối đa 10)
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
NB: Kế hoạch thực hiện ở trên là cho định nghĩa bảng đơn giản
CREATE TABLE [dbo].[YourTable](
[YourCol] [int] NOT NULL CONSTRAINT [SomeIndex] PRIMARY KEY CLUSTERED
)
Về mặt kỹ thuật, Sắp xếp trên nhánh dưới cùng không cần thiết vì điều đó cũng được đặt hàng bởi Diff và có thể hợp nhất hai kết quả được đặt hàng. Nhưng tôi đã không thể có được kế hoạch đó.
Truy vấn có ORDER BY Diff ASC, YourCol ASC
và không chỉ ORDER BY YourCol ASC
, bởi vì đó là những gì đã kết thúc hoạt động để loại bỏ Sắp xếp trong nhánh trên cùng của kế hoạch. Tôi cần thêm cột thứ cấp vào (mặc dù nó sẽ không thay đổi kết quả như YourCol
nhau đối với tất cả các giá trị có cùng Diff) để nó đi qua phép nối hợp nhất (nối) mà không cần thêm Sắp xếp.
SQL Server dường như có thể suy ra rằng một chỉ mục trên X được tìm kiếm theo thứ tự tăng dần sẽ phân phối các hàng theo thứ tự X + Y và không cần sắp xếp. Nhưng không thể suy ra rằng việc di chuyển chỉ mục theo thứ tự giảm dần sẽ phân phối các hàng theo cùng thứ tự với YX (hoặc thậm chí chỉ đơn thuần trừ X). Cả hai nhánh của kế hoạch đều sử dụng một chỉ mục để tránh sắp xếp nhưng TOP 10
nhánh ở nhánh dưới sau đó được sắp xếp theo Diff
(mặc dù chúng đã theo thứ tự đó) để có được chúng theo thứ tự mong muốn cho việc hợp nhất.
Đối với các truy vấn / định nghĩa bảng khác, có thể khó hơn hoặc không thể có được kế hoạch hợp nhất chỉ với một loại của một nhánh - vì nó phụ thuộc vào việc tìm một biểu thức đặt hàng mà SQL Server:
- Chấp nhận rằng tìm kiếm chỉ mục sẽ cung cấp thứ tự được chỉ định để không cần sắp xếp trước khi đứng đầu.
- Rất vui khi sử dụng trong hoạt động hợp nhất vì vậy không yêu cầu sắp xếp sau
TOP
SELECT TOP 10 * FROM YourTable ORDER BY ABS(YourCol - 32) ;
chí đơn giản hơn. Cũng không hiệu quả.