Bagaimana cara mengubah nilai standar seluruh sistem MAXRECURSION
?
Secara default 100, tapi saya perlu meningkatkannya menjadi sekitar 1000.
Saya tidak dapat menggunakan petunjuk permintaan karena saya menggunakan program yang mengambil permintaan saya dan menjalankannya untuk saya dan sayangnya saya tidak bisa mengatasi batasan ini.
Namun, saya memiliki hak admin pada instance server. Saya sudah mencari-cari di sisi server, tapi saya tidak melihat apa pun di sana yang terkait dengan opsi kueri atau rekursi. Saya berasumsi ada memiliki menjadi suatu tempat di mana saya bisa memperbarui seluruh sistem default.
Ada ide?
sql-server
configuration
recursive
carl.anderson
sumber
sumber
Jawaban:
Jika kueri Anda memiliki bentuk umum, Anda mungkin dapat menambahkan petunjuk maxrecursion yang diperlukan menggunakan satu atau lebih panduan paket.
Mungkin ada cara untuk memperbaikinya. Jika Anda menambahkan detail kueri spesifik ke pertanyaan Anda, kami mungkin dapat menyelesaikannya untuk Anda. Biasanya, Anda akan melacak SQL yang benar-benar mengenai server, atau mendapatkan formulir parameter menggunakan prosedur built-in sys.sp_get_query_template , dan kemudian membuat panduan TEMPLATE dan / atau OBJECT / SQL plan.
Lihat dokumentasi untuk informasi lebih lanjut:
Panduan paket perlu divalidasi ulang setiap kali kode aplikasi berubah, dan ketika SQL Server ditambal atau ditingkatkan. Ini seharusnya hanya menjadi bagian dari siklus pengujian normal Anda.
Perhatikan bahwa validasi panduan paket menggunakan sys.fn_validate_plan_guide dapat melaporkan kesalahan secara tidak benar jika pernyataan yang dipandu merujuk tabel sementara. Lihat pertanyaan ini:
Validasi panduan paket dengan fn_validate_plan_guide memberikan hasil positif palsu
The Rencana Panduan Sukses dan Rencana Panduan Gagal Profiler dan Acara diperpanjang kelas juga dapat digunakan untuk memantau rencana aplikasi panduan.
Connect dihentikan sebelum saran peningkatan produk Izinkan nilai batas MAXRECURSION selain 100 untuk tampilan dan UDF oleh Steve Kass diimplementasikan. Jika Anda ingin mengambilnya dengan Microsoft sekarang, lihat opsi di SQL Server bantuan dan umpan balik .
sumber
Jika Anda benar-benar harus menggunakan fungsi (batasan alat ETL Anda seperti yang Anda maksudkan), Anda dapat menentukan
OPTION
sebagai bagian dari fungsi bernilai tabel multi-pernyataan, misalnya sesuatu seperti ini:Ini juga berfungsi untuk saya ketika dibungkus dalam tampilan seperti yang Anda sarankan alat ETL Anda. Tidak ada cara untuk mengubah seluruh sistem ini, tetapi karena rekursi dapat menjadi tidak efisien, ini mungkin merupakan hal yang baik. Anda tidak bisa menentukan petunjuk kueri (menggunakan
OPTION
) di dalam tubuh fungsi bernilai tabel inline, seperti dalam contoh Anda.Pertimbangkan mengubah proses Anda untuk berjalan hierarki hanya sekali ketika Anda menerima Episode Anda dan menyimpan hasilnya dalam tabel relasional. Anda dapat menggunakan proc yang disimpan untuk melakukan ini sehingga tidak akan mengalami batasan ini.
Saya juga berpikir mungkin ada bug dalam kode Anda: jika CTE Anda bergabung di personId dan berulang di eventId, eventId 101 akan muncul dua kali saya pikir, sebagai duplikat. Mungkin saya salah mengartikan kode Anda, beri tahu saya pendapat Anda.
HTH
sumber
Saya mengambil inspirasi dari topik ini .
Inilah yang saya lakukan untuk menyelesaikan masalah.
Lalu saya memanggil fungsi ini seperti ini:
Dengan cara ini, tidak ada logika CTE saya harus diulang dan saya tidak membayar apa pun tambahan dalam hal kinerja. Ini adalah gangguan yang harus dilakukan dengan cara ini, tetapi saya bisa hidup dengannya.
sumber
where
klausul setelah elipsis mencegah terlalu banyak recursions terjadi dengan menggunakan parameter fungsi sebagai kendala. Saya kira harus ada pernyataan setelah definisi CTE. Saya akan menambahkannya.EventID=1
(dan 101.201, ... 901). Tetapi kueri asli (jika dijalankan dengan MAXRECURSION = 100000000) mungkin tidak pernah mengunjungi baris denganEventID=101
(dan 201, .., 901). Jadi dua pertanyaan (asli dan solusi Anda) dapat memberikan hasil yang berbeda (tidak ada baris dengan 101 di yang pertama, ya di ke-2)! Atau mungkin mengunjungi 101 tetapi sebelum langkah 100, jadi solusi Anda akan menyertakan baris dua kali dalam hasil (lagi berbeda)