DBCC FREEPROCCACHE
tidak bekerja di Azure SQL DB. Bagaimana lagi saya bisa memaksakan rencana untuk menendang keluar dari cache dengan cara yang tidak akan merusak sistem produksi (yaitu saya tidak bisa begitu saja mengubah tabel mau tak mau)? Ini khusus untuk SQL yang dibuat oleh Entity Framework, jadi ini bukan procs tersimpan yang dikelola sendiri - ini SQL dinamis yang efektif.
(Sumber adalah indeks buruk -> statistik buruk, dll. Itu semua sudah diperbaiki, tetapi rencana yang buruk tidak akan hilang.)
UPDATE: Saya memilih solusi @ mrdenny ketika dia sampai di sana dulu. Namun, saya berhasil menggunakan skrip @Aaron Bertrand untuk melakukan pekerjaan itu. Terima kasih untuk semua orang atas bantuannya !!
sql-server
execution-plan
azure-sql-database
Jaxidian
sumber
sumber
sp_executesql
.Jawaban:
Azure SQL sekarang langsung mendukung ini
Azure SQL Database secara langsung mendukung pembersihan cache proc dari database pengguna saat ini tanpa peretasan:
informasi tambahan
Script berikut (oleh Shannon Gowen ) dapat digunakan untuk menonton proses langkah-demi-langkah:
sumber
Tidak ada cara eksplisit untuk melakukan ini hari ini, tapi itu bukan skenario permanen (perintah DBCC masih belum didukung, tetapi baca di Query Store ). Bahkan ketika perubahan skema diterima, itu mungkin bukan yang Anda inginkan, karena itu akan membatalkan semua rencana yang terkait dengan objek yang mendasarinya, bukan hanya yang buruk.
Tidak mencari kredit untuk ini, tetapi membangun SQL dinamis untuk melakukan operasi yang sama terhadap beberapa tabel cukup mudah:
(Saya menulis tip tentang masalah "panjang SQL dinamis" ini ...)
sumber
nvarchar(max)
variabel Anda mencapai batas setelah 4000 karakter, 8000 karakter jika saya mengubahnyavarchar(max)
. Menjalankan skrip yang tepat. Kami memiliki ~ 450 tabel, jadi kami dapat dengan mudah (~ 30/60 tabel di).varchar(max)
sintaks yang valid, hanya identik denganvarchar(8000)
, dannvarchar(max)
identik dengannvarchar(4000)
.PRINT
perintah, itu hanya menampilkan 8000 byte. Itu adalah batasanPRINT
perintah, bukan Azure. Jika Anda menjalankan perintah itu akan berfungsi bahkan jika Anda tidak dapat memeriksa semuanya secara visual.Tambahkan kolom nullable ke tabel lalu jatuhkan kolom. Itu akan memaksa SQL untuk membersihkan cache untuk objek itu.
Sedangkan untuk melakukan semua tabel, kursor harus melakukan trik. Cukup gunakan nama kolom yang tidak akan pernah ada di tabel apa pun seperti 'zzzzzz_go_away' atau sesuatu.
sumber
Database SQL Azure saat ini tidak mendukung
DBCC FREEPROCCACHE
, jadi Anda tidak bisa menghapus rencana eksekusi dari cache secara manual. Namun, jika Anda membuat perubahan pada tabel atau tampilan yang dirujuk oleh kueri (ALTER TABLE
/ALTER VIEW
) paket tersebut akan dihapus dari cache. ( Referensi .)sumber
Untuk menghapus semua rencana eksekusi, gunakan ini:
Jika Anda mengubah tabel atau tampilan referensi itu, rencana eksekusi dihapus.
Sedikit lebih dijelaskan di sini http://christianarg.wordpress.com/2013/08/22/remove-execution-plans-dari-prosedur-cache-in-sql-azure/
sumber