Pertama, Anda harus memverifikasi bahwa pengurutan tersebut sebenarnya merupakan hambatan kinerja. Durasi pengurutan akan bergantung pada jumlah elemen yang akan diurutkan, dan jumlah penyimpanan untuk toko induk tertentu kemungkinan kecil. (Dengan asumsi operator sortir diterapkan setelah menerapkan klausa where).
Itu generalisasi yang berlebihan. Seringkali, operator sortir dapat dengan mudah dipindahkan ke indeks, dan, jika hanya beberapa baris pertama dari kumpulan hasil yang diambil, dapat secara substansial mengurangi biaya kueri, karena database tidak lagi harus mengambil semua baris yang cocok (dan mengurutkannya semua) untuk menemukan yang pertama, tetapi dapat membaca catatan dalam urutan hasil yang ditetapkan, dan berhenti setelah cukup banyak catatan ditemukan.
Dalam kasus Anda, Anda tampaknya mengambil seluruh set hasil, jadi pengurutan yang tidak mungkin membuat segalanya menjadi lebih buruk (kecuali set hasil sangat besar). Juga, dalam kasus Anda, mungkin tidak mudah untuk membangun indeks terurut yang berguna, karena klausa where berisi or.
Sekarang, jika Anda masih ingin menyingkirkan operator pengurutan tersebut, Anda dapat mencoba:
SELECT [Phone]
FROM [dbo].[Store]
WHERE [ParentStoreId] = 10
AND [Type] in (0, 1)
ORDER BY [Phone]
Atau, Anda dapat mencoba indeks berikut:
CREATE NONCLUSTERED INDEX IX_Store ON dbo.[Store]([ParentStoreId], [Phone], [Type])
untuk mencoba mendapatkan pengoptimal kueri untuk melakukan pemindaian rentang indeks pada ParentStoreId
saja, lalu pindai semua baris yang cocok dalam indeks, keluarkan jika Type
pertandingan. Namun, ini mungkin menyebabkan lebih banyak I/O disk, dan karenanya memperlambat kueri Anda daripada mempercepatnya.
Sunting :Sebagai upaya terakhir, Anda dapat menggunakan
SELECT [Phone]
FROM [dbo].[Store]
WHERE [ParentStoreId] = 10
AND [Type] = 0
ORDER BY [Phone]
UNION ALL
SELECT [Phone]
FROM [dbo].[Store]
WHERE [ParentStoreId] = 10
AND [Type] = 1
ORDER BY [Phone]
dengan
CREATE NONCLUSTERED INDEX IX_Store ON dbo.[Store]([ParentStoreId], [Type], [Phone])
dan mengurutkan dua daftar di server aplikasi, di mana Anda dapat menggabungkan (seperti dalam sortir gabungan) daftar yang telah disortir sebelumnya, sehingga menghindari pengurutan lengkap. Tapi itu benar-benar optimasi mikro yang, sementara mempercepat pengurutan itu sendiri dengan urutan besarnya, tidak mungkin banyak mempengaruhi total waktu eksekusi kueri, karena saya berharap hambatannya adalah jaringan dan disk I/O, terutama mengingat fakta bahwa disk akan melakukan banyak akses acak karena indeks tidak berkerumun.