Đây là một câu hỏi phụ từ thứ tự Sắp xếp được chỉ định trong khóa chính, nhưng việc sắp xếp được thực hiện trên CHỌN .
@Catcall nói điều này về chủ đề của thứ tự lưu trữ (chỉ mục được nhóm) và thứ tự đầu ra
Rất nhiều người tin rằng một chỉ mục được nhóm đảm bảo một thứ tự sắp xếp trên đầu ra. Nhưng đó không phải là những gì nó làm; nó đảm bảo một thứ tự lưu trữ trên đĩa. Xem, ví dụ, bài blog này .
Tôi đã đọc bài đăng trên blog của Hugo Kornelis và hiểu rằng một chỉ mục không đảm bảo rằng máy chủ sql đọc các bản ghi theo một thứ tự cụ thể. Tuy nhiên, tôi có một thời gian khó chấp nhận rằng tôi không thể giả định điều này cho kịch bản của mình?
CREATE TABLE [dbo].[SensorValues](
[DeviceId] [int] NOT NULL,
[SensorId] [int] NOT NULL,
[SensorValue] [int] NOT NULL,
[Date] [int] NOT NULL,
CONSTRAINT [PK_SensorValues] PRIMARY KEY CLUSTERED
(
[DeviceId] ASC,
[SensorId] ASC,
[Date] DESC
) WITH (
FILLFACTOR=75,
DATA_COMPRESSION = PAGE,
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF,
IGNORE_DUP_KEY = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON)
ON [MyPartitioningScheme]([Date])
Truy vấn ban đầu của tôi là:
SELECT TOP 1 SensorValue
FROM SensorValues
WHERE SensorId = 53
AND DeviceId = 3819
AND Date < 1339225010
ORDER BY Date DESC
Nhưng tôi đề nghị rằng tôi cũng có thể sử dụng cái này (đọc bên dưới để giải thích cho tôi):
SELECT TOP 1 SensorValue
FROM SensorValues
WHERE SensorId = 53
AND DeviceId = 3819
AND Date < 1339225010
Như bạn có thể thấy, các hàng trong bảng của tôi nhỏ (16byte) và tôi chỉ có một chỉ mục, một cụm. Trong kịch bản của tôi, bảng bao gồm 100.000.000 bản ghi tại thời điểm này (và điều này rất có thể sẽ tăng gấp 10 lần).
Khi máy chủ cơ sở dữ liệu truy vấn bảng này, nó có hai cách để tìm các hàng của tôi, hoặc nó tìm khóa chính và do đó đọc và trả về các giá trị của tôi trong desc. thứ tự của Ngày, hoặc nó phải thực hiện quét toàn bộ bảng. Kết luận của tôi là quét toàn bộ bảng trên tất cả các bản ghi đó sẽ quá chậm và do đó máy chủ cơ sở dữ liệu sẽ luôn tìm kiếm bảng thông qua khóa chính của nó và do đó trả về các giá trị được sắp xếp theoDate DESC
ORDER BY
mệnh đề là một thành tích lớn đối với tôi (đọc câu hỏi khác để biết thêm). Tôi có một giải pháp hoạt động ngay bây giờ, nhưng nó sẽ không giữ được khi nào và nếu lưu lượng truy cập của tôi tăng lên.
ORDER BY
điều khoản trong truy vấn của bạn. Điều này đúng với SQL Server , Oracle , MySQL và bất kỳ RDBMS nào khác mà bạn có thể nghĩ đến. Hãy thử bất cứ điều gì khác và bạn đang thiết lập cho mình một cốc FAIL bất ngờ.
ORDER BY
nó ở đó, sau đó bạn biết bạn có thể dựa vào nó. Xem # 3 tại đây