Bagaimana saya bisa mencegah SSMS menulis ulang kode saya saat menyimpan tampilan?

8

Saya membuat tampilan yang menggunakan pernyataan dengan WHEREklausa yang mirip dengan ini:

WHERE
    (
        col1 IS NOT NULL
        OR
        col2 IS NOT NULL
    )
    AND
    NOT EXISTS (SELECT ...)

yang membutuhkan rata-rata 10 detik untuk dijalankan. Namun, ketika saya mencoba menyimpan kueri ini sebagai View, SQL Server (atau MS SQL Server Management Studio Client) "mengoptimalkan" kueri untuk menggunakan struktur ini, sebagai gantinya:

WHERE
    (col1 IS NOT NULL AND NOT EXISTS (SELECT ...))
    OR
    (col2 IS NOT NULL AND NOT EXISTS (SELECT ...))

Memperlambat kueri menjadi 6+ menit. Apakah ada cara untuk menonaktifkan perilaku ini, sehingga tampilan menggunakan persis SQL Query yang saya berikan?

Zikes
sumber

Jawaban:

14

Jangan gunakan penyihir SSMS.

cukup ketik CREATE VIEW dbo.Foo AS SELECT ...pernyataan Anda di jendela permintaan baru dan jalankan.

Ini akan menghentikannya mengatur ulang sintaks kueri menjadi alternatif yang setara secara semantik tetapi berkinerja lebih buruk.

Martin Smith
sumber
4
Dan semua tampilan, procs tersimpan, UDF, tabel, dll. Semua objek yang dibuat atau diubah harus tetap dalam skrip sehingga mereka dapat dimasukkan ke dalam kontrol sumber seperti semua kode lainnya.
HLGEM
1
Ada beberapa alat SQL grafis di luar sana yang layak dan tidak akan melakukan hal-hal bodoh seperti ini
Earlz
2
@ Earlz benar, tapi saya pikir kita semua tahu kita berbicara tentang SSMS secara khusus, tidak semua alat grafis secara umum.
Aaron Bertrand