Dapatkah saya meningkatkan kinerja pada Tabel Sistem Kembung?

12

Latar Belakang:
Saya memiliki banyak basis data dengan sejumlah besar LIHAT, dan sejumlah besar SYNONYM. Sebagai contoh, satu db memiliki lebih dari 10k PANDANGAN dan 2 + juta SYNONYM.

Masalah Umum:
Permintaan yang melibatkan sys.objects(dan tabel sistem secara umum) cenderung lambat. Pertanyaan yang melibatkan sys.synonymsglasial. Saya bertanya-tanya apa yang bisa saya lakukan untuk meningkatkan kinerja.

Contoh Khusus
Perintah ini dijalankan oleh alat pihak ketiga. Ini lambat di kedua aplikasi, dan di SSMS:

exec sp_tables_rowset;2 NULL,NULL

Pertanyaan Saya :
Bagaimana saya bisa membuat ini berjalan lebih cepat?

Apa yang Saya Mencoba :
Jika SET STATISTICS IO ONsaya mendapatkan output ini:

(2201538 baris dipengaruhi)
Tabel 'sysobjrdb'. Pindai hitungan 1, bacaan logis 28, bacaan fisik 0, bacaan baca-depan 0, bacaan logis lob 0, bacaan fisik lob 0, bac baca baca depan 0.
Tabel 'sysschobjs'. Pindai hitungan 1, bacaan logis 53926, bacaan fisik 0, bacaan baca depan 0, bacaan logis lob 0, bacaan fisik lob 0, bacaan baca lob depan 0.

Saya telah dapat memperbarui statistik pada tabel sistem yang mendasarinya. Ini telah berhasil di lingkungan SQL 2008 R2 saya atau yang lebih baru:

UPDATE STATISTICS sys.sysobjrdb WITH FULLSCAN
UPDATE STATISTICS sys.sysschobjs WITH FULLSCAN

Saya juga sudah bisa melakukan pemeliharaan indeks. Ini berfungsi di SQL 2012 saya atau lingkungan yang lebih baru. Misalnya menjalankan sp_help 'sys.sysschobjs'mengidentifikasi indeks di atas meja, dan dari sana saya membuat dan menjalankan perintah ini:

ALTER INDEX clst ON sys.sysschobjs REORGANIZE
ALTER INDEX nc1 ON sys.sysschobjs REORGANIZE
ALTER INDEX nc2 ON sys.sysschobjs REORGANIZE
ALTER INDEX nc3 ON sys.sysschobjs REORGANIZE

Memperbarui statistik dan menyusun ulang indeks membantu, tetapi tidak banyak.

Dave Mason
sumber
Aduh. Saya kira Anda sedang melakukan beberapa jenis penyewa yang kacau, menyimpan data semua orang di tabel yang sama & memfilternya dengan tampilan & menggunakan sinonim untuk memberi nama mereka setelah objek dasar, dalam skala besar? Apa pun yang terjadi, saya rasakan untuk Anda
Philᵀᴹ
2
Penyewa multi? Sebenarnya tidak. Bukan itu. Cukup kacau, bukan? FWIW, ini pemahaman saya bahwa untuk setiap pengguna aplikasi, ada 5 SYNONYM yang dibuat untuk setiap tabel. Beruntung saya.
Dave Mason
Apakah menghapus izin untuk beberapa objek tersebut meningkatkan kinerja (sehingga ada sedikit dari mereka yang berpotensi digunakan?) Saya tidak tahu apakah itu bahkan merupakan opsi di tingkat pengguna.
ConstantineK
Akan menarik untuk melihat rencana eksekusi ini. mungkin Anda bisa mempostingnya dari sql sentry plan explorer ke answer.sqlperformance.com dan tautkan ke sana, kecuali ada cara untuk menyematkan ini di sini juga. Saya akan menarik melihatnya
Sheldon

Jawaban:

1

Jika Anda belum melakukannya, Anda bisa mendapatkan kinerja dengan memindahkan file data primer ke kumpulan spindel yang terpisah dari sisa data (lihat Arsitektur File dan Filegroup dan SQL Server: filegroup hanya untuk tabel sistem? ).

Ziggy Crueltyfree Zeitgeister
sumber
Saya pikir ini adalah saran yang baik, akan tetapi, ini akan dinegasikan untuk berdampak banyak jika pengaturan IO bukan server fisik standar dengan disk yang terpasang, misalnya virtual dengan SAN, atau drive SSD akan meminimalkan dampak nyata dari pemisahan file data primer. ke lokasi yang berbeda, kan?
SheldonH
1
Jika Anda memiliki kendali atas perangkat keras (mis. Anda tidak dihosting oleh pihak ketiga), Anda dapat memiliki set spindel yang berbeda di SAN (mis. Dua atau lebih volume RAID-10 yang terpisah). Jika Anda menggunakan (atau meng-host) dengan SSD, maka tidak ada spindel, dan IO akan dibatasi terutama oleh apa pun yang menjadi hambatan antara drive dan motherboard (yaitu SATA, RAID, atau kartu NIC, kabel, router / switch , SAN, kecepatan SSD), sehingga Anda tidak akan mendapatkan apa pun dengan memisahkan file dalam kasus itu.
Ziggy Crueltyfree Zeitgeister