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

Bagaimana cara meningkatkan kinerja fungsi non-deterministik kolom di klausa where atau join?

Selain fungsi non-deterministik, masalah yang saya lihat adalah Anda melakukan perhitungan di lapangan. Ini (biasanya) membuat indeks apa pun di bidang tidak dapat digunakan oleh kueri.

Paragraf kedua dari tautan ini (Sepuluh Kesalahan Pemrograman SQL Umum (Fungsi pada kolom yang diindeks dalam predikat) ) memberikan info lebih detail tentang kapan hal ini terjadi, cara menghindarinya, dan bagaimana terkadang pengoptimal dapat menggunakan indeks meskipun menggunakan fungsi.

Singkatnya, alih-alih mengandalkan pengoptimal yang ditingkatkan, seringkali mungkin untuk mengubah kueri dengan menjaga bidang tetap utuh (tanpa melakukan perhitungan apa pun di atasnya), melainkan melakukan perhitungan (terbalik) ke nilai lainnya. Dalam kasus Anda hingga tanggal saat ini yang disediakan oleh GetDate() . Kemudian kueri dapat menggunakan indeks bidang table1.Date .

Jadi, Anda dapat menggunakan sesuatu seperti:

SELECT COUNT(*) 
FROM table1
WHERE table1.Date
      BETWEEN
             /* First Day of Current Month */
          AND 
             /* Last Day of Current Month */

Dan Anda hanya perlu menemukan fungsi yang memberi Anda hari pertama dan terakhir bulan ini.

Posting blog ini dapat membantu Anda:sql-server-query-to-find-first-and-last-day-of-current-month/

Lebih baik lagi, pertanyaan/jawaban StackOverflow ini:cara-tersederhana-untuk-membuat-tanggal-itu-adalah-hari-pertama-bulan-diberikan -tanggal lain

Saya harus menguji tetapi saya pikir sedikit variasi di atas ini akan berhasil:

SELECT COUNT(*) 
FROM table1
WHERE table1.Date 
      >=      /* First Day of Current Month */
        DATEADD(mm, DATEDIFF(mm, 0, GetDate() ), 0) 
  AND table1.Date 
      <       /* First Day of Next Month */
        DATEADD(mm, 1 + DATEDIFF(mm, 0, GetDate() ), 0) 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kesalahan MSSQL 'Penyedia yang mendasari gagal saat Buka'

  2. hapus baris kunci utama yang merupakan kunci asing dari tabel lain

  3. Memahami Ukuran Penyimpanan 'datetimeoffset' di SQL Server

  4. Bagaimana cara menambahkan atribut ke node xml di sql server 2005

  5. Bagaimana cara menghilangkan batasan unik dari kolom tabel?