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

SELECT TOP lambat, terlepas dari ORDER BY

Maka dimulailah permainan "mencoba mengakali pengoptimal (karena tidak selalu yang terbaik)".

Anda dapat mencoba memasukkan bagian pemfilteran ke dalam subkueri atau CTE:

SELECT TOP 30 *
FROM
   (SELECT *
   FROM myview, foo, bar 
   WHERE shared=1 AND [joins and other stuff]) t
ORDER BY sortcode;

Yang mungkin cukup untuk memaksanya memfilter terlebih dahulu (tetapi pengoptimal menjadi "lebih pintar" dengan setiap rilis, dan terkadang dapat melihat melalui kejahatan semacam itu). Atau Anda mungkin harus memasukkan kode ini ke dalam UDF . Jika Anda menulis UDF sebagai fungsi bernilai tabel multipernyataan, dengan pemfilteran di dalamnya, lalu kueri UDF tersebut dengan TOP x Anda /ORDER BY , Anda telah memaksakan urutan kueri dengan cukup baik (karena SQL Server saat ini tidak dapat mengoptimalkan UDF multi-pernyataan).

Tentu saja, memikirkannya, memperkenalkan UDF hanyalah cara menyembunyikan apa yang sebenarnya kami lakukan - buat tabel temp, gunakan satu kueri untuk mengisinya (berdasarkan filter WHERE), lalu kueri lain untuk menemukan TOP x dari tabel temp.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server XML ada()

  2. Format SQL Server Tanggal DD.MM.YYYY HH:MM:SS

  3. Kredensial untuk layanan Agen Server SQL tidak valid

  4. DateTime.Now ke smalldatetime?

  5. Menggunakan SQL Server sebagai penyimpanan Gambar