Ini adalah pertanyaan spin-off dari Urutan urutan yang ditentukan dalam kunci utama, namun penyortiran dieksekusi pada SELECT .
@Catcall mengatakan ini tentang masalah urutan penyimpanan (indeks berkerumun) dan urutan keluaran
Banyak orang percaya bahwa indeks berkerumun menjamin urutan pengurutan pada output. Tapi bukan itu yang dilakukannya; itu menjamin pesanan penyimpanan pada disk. Lihat, misalnya, posting blog ini .
Saya telah membaca posting blog oleh Hugo Kornelis dan memahami bahwa indeks tidak menjamin bahwa server sql membaca catatan dalam urutan tertentu. Namun saya mengalami kesulitan menerima bahwa saya tidak dapat menganggap ini untuk skenario saya?
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])
Permintaan asli saya adalah ini:
SELECT TOP 1 SensorValue
FROM SensorValues
WHERE SensorId = 53
AND DeviceId = 3819
AND Date < 1339225010
ORDER BY Date DESC
Tetapi saya menyarankan agar saya bisa menggunakan yang ini (baca penjelasan saya di bawah):
SELECT TOP 1 SensorValue
FROM SensorValues
WHERE SensorId = 53
AND DeviceId = 3819
AND Date < 1339225010
Seperti yang Anda lihat, baris tabel saya kecil (16bytes) dan saya hanya punya satu indeks, berkerumun. Dalam skenario saya, tabel terdiri dari 100.000.000 catatan saat ini (dan ini kemungkinan besar akan meningkat sepuluh kali lipat).
Ketika server basis data kueri tabel ini memiliki dua cara untuk menemukan baris saya, baik itu mencari kunci utama dan dengan demikian membaca dan mengembalikan nilai-nilai saya dalam desc. urutan Tanggal, atau harus melakukan pemindaian tabel penuh. Kesimpulan saya adalah bahwa pemindaian tabel penuh pada semua catatan itu akan terlalu lambat dan karena itu server database akan selalu mencari tabel melalui kunci primernya dan dengan demikian mengembalikan nilai yang diurutkan berdasarkanDate DESC
ORDER BY
klausa itu merupakan hit kinerja besar bagi saya (baca pertanyaan lain untuk info lebih lanjut). Saya memiliki solusi yang berfungsi untuk saat ini, tetapi tidak akan bertahan kapan dan jika traffic saya meningkat.
ORDER BY
klausa dalam kueri Anda. Ini berlaku untuk SQL Server , Oracle , MySQL , dan RDBMS lainnya yang dapat Anda pikirkan. Cobalah hal lain dan Anda menyiapkan secangkir FAIL kejutan.
ORDER BY
di sana, maka Anda tahu Anda bisa mengandalkannya. Lihat # 3 di sini