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

Mengapa kueri melambat secara drastis jika dalam klausa WHERE konstanta diganti dengan parameter (memiliki nilai yang sama)?

Seperti yang disarankan Martin dalam komentar di bawah pertanyaan, masalahnya adalah bahwa server SQL tidak menekan predikat dengan benar dari klausa WHERE - lihat tautan di komentarnya.

Saya akhirnya membuat fungsi bernilai tabel yang ditentukan pengguna dan menggunakannya dengan operator CROSS APPLY untuk membuat tampilan.

Mari kita lihat solusinya sendiri.

Fungsi Nilai Tabel Buatan Pengguna

CREATE FUNCTION [dbo].[TestFunction] (@Id INT)
RETURNS TABLE 
AS
RETURN 
(
    WITH
    Hierarchy (Id,  ParentId, Data, Depth)
    AS(
    SELECT Id, ParentId, NULL AS Data, 0 AS Depth FROM Test Where Id = @Id
    UNION ALL
    SELECT h.Id, t.ParentId, COALESCE(h.Data, t.Data), Depth + 1 AS Depth
        FROM Hierarchy h
            INNER JOIN Test t ON t.Id = h.ParentId
    )
    SELECT * FROM Hierarchy
)

Lihat

CREATE VIEW [dbo].[TestView]
AS
SELECT t.Id, t.ParentId, f.Data, f.Depth
FROM
    Test AS t
    CROSS APPLY TestFunction(Id) as f

Kueri dengan konstanta

SELECT * FROM TestView WHERE Id = 69

Kueri dengan parameter

DECLARE @Id INT
SELECT @Id = 69
SELECT * FROM TestView WHERE Id = @Id

Kueri dengan parmater pada dasarnya dieksekusi secepat kueri dengan konstanta.

Terima kasih Martin dan untuk yang lainnya juga!



  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 String atau data biner akan terpotong

  2. Dapatkan semua orang tua untuk seorang anak

  3. Saat menggunakan GETDATE() di banyak tempat, apakah lebih baik menggunakan variabel?

  4. Bagaimana cara memeriksa apakah string koneksi valid?

  5. Jeda replikasi server SQL untuk sementara