Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Mengoptimalkan kueri SQL dengan menghapus operator Sortir dalam paket Eksekusi

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Keamanan Terintegrasi =Salah

  2. SQL:Mendapatkan hitungan dari banyak tabel untuk catatan pengguna di tabel USER. Apa pendekatan terbaik?

  3. Perbandingan Tipe Data Tanggal &Waktu di SQL Server

  4. Berisi () fungsi terputus-putus dengan string angka?

  5. Menghapus Akun Email Database dari Profil (SSMS)