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

Apakah pernyataan WITH dijalankan sekali per kueri atau sekali per baris?

Contoh:

SET NOCOUNT ON;
SET IMPLICIT_TRANSACTIONS ON;

CREATE TABLE MyTable (MyID INT  PRIMARY KEY);
GO
INSERT  MyTable (MyID)
VALUES  (11), (22), (33), (44), (55);

PRINT 'Test MyCTE:';
WITH MyCTE
AS (
    SELECT  *, ROW_NUMBER()OVER(ORDER BY MyID) AS RowNum
    FROM    MyTable
)
SELECT  *
FROM    MyCTE crt
LEFT JOIN MyCTE prev ON crt.RowNum=prev.RowNum+1;

ROLLBACK;

Jika Anda menjalankan skrip sebelumnya di SSMS (tekan Ctrl+M -> Rencana Eksekusi Aktual) maka Anda akan mendapatkan rencana eksekusi ini untuk kueri terakhir:

Dalam hal ini, CTE dijalankan satu kali untuk crt alias dan lima (!) kali untuk prev alias, sekali untuk setiap baris dari crt .

Jadi, jawaban untuk pertanyaan ini

adalah both :sekali per kueri (crt ) dan sekali per baris (prev :sekali untuk setiap untuk dari crt ).

Untuk mengoptimalkan kueri ini, sebagai permulaan,1) Anda dapat mencoba menyimpan hasil dari CTE (MyCTE atau Query ) menjadi variabel tabel atau tabel temp

2) Tentukan kunci utama tabel ini sebagai kolom gabungan,

3) Tulis ulang kueri terakhir untuk menggunakan variabel tabel atau tabel temp ini.

Tentu saja, Anda dapat mencoba menulis ulang kueri terakhir tanpa bergabung sendiri di antara CTE.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana Saya Dapat Mendeteksi dan Mengikat Perubahan Antara Nilai Baris dalam Tabel SQL?

  2. Parameter Prosedur Tersimpan SQL yang Rusak?

  3. Pengoptimalan Kueri SQL

  4. lulus parameter dalam fungsi bernilai tabel menggunakan pernyataan pilih

  5. Memilih data dari dua server berbeda di SQL Server