Şişirilmiş Sistem Tablolarındaki Performansı Artırabilir miyim?


12

Arka plan:
Çok sayıda VIEW ve çok sayıda SYNONYM içeren çok sayıda veritabanım var. Örneğin, bir db 10k'den fazla VIEW ve 2+ milyon SYNONYM'ye sahiptir.

Genel Sorun: (ve genel olarak sistem tablolarını)
içeren sorgular sys.objectsyavaş olma eğilimindedir. İçeren sorgular sys.synonymsbuzuldur. Performansı artırmak için neler yapabileceğimi merak ediyorum.

Özel Örnek
Bu komut bir üçüncü taraf aracı tarafından çalıştırılır. Hem uygulamada hem de SSMS'de yavaş:

exec sp_tables_rowset;2 NULL,NULL

Sorum :
Bu çalışmayı nasıl daha hızlı yapabilirim?

Ne Denedim ettik :
Ben Eğer SET STATISTICS IO ONbu çıktıyı almak:

(2201538 satır etkilendi)
Tablo 'sysobjrdb'. Tarama sayısı 1, mantıksal okuma 28, fiziksel okuma 0, okuma öncesi okuma 0, lob mantıksal okuma 0, lob fiziksel okuma 0, lob okuma öncesinde 0 okuma
. Tablo 'sysschobjs'. Tarama sayısı 1, mantıksal okuma 53926, fiziksel okuma 0, okuma öncesi okuma 0, lob mantıksal okuma 0, lob fiziksel okuma 0, lob okuma önceden okuma 0.

Temel sistem tablolarındaki istatistikleri güncelleyebildim. Bu benim SQL 2008 R2 veya daha yeni ortamlarda çalıştı:

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

Ayrıca dizin bakımı da yapabildim. Bu benim SQL 2012 veya daha yeni ortamlarda çalışır. Örneğin çalışan sp_help 'sys.sysschobjs'tablodaki dizinleri tanımlar ve oradan bu komutları oluşturup çalıştırırım:

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

İstatistikleri güncellemek ve dizinleri yeniden düzenlemek yardımcı olur, ancak çok fazla değil.


Ahh. Herkesin verilerini aynı tablolarda tutmak ve görünümlerle filtrelemek ve temel nesneden sonra büyük bir ölçekte adlandırmak için eşanlamlıları kullanmak, çok kiracılı bazı karışık tipte yaptığınızı tahmin ediyorum? Her iki durumda da, seni hissediyorum
Philᵀᴹ

2
Çok kiracı? Aslında hayır. Öyle değil. Çok berbat, değil mi? FWIW, her uygulama kullanıcısı için her tablo için 5 SYNONYM oluşturulduğunu anlıyorum. Şanslıyım.
Dave Mason

Bu nesnelerin bazılarına yönelik izinleri kaldırmak performansı artırıyor mu (böylece potansiyel olarak kullanılacak daha azı var mı?) Bunun kullanıcı düzeyinde bir seçenek olup olmadığını bilmiyorum.
ConstantineK

Bu konuda bir icra planı görmek ilginç olurdu. belki sql nöbetçi planı explorer cevaplar.sqlperformance.com göndermek ve buraya da gömmek için bir yol olmadığı sürece bağlantı olabilir.
Şuna

Yanıtlar:


1

Daha önce yapmadıysanız, birincil veri dosyasını verilerin geri kalanından ayrı bir iş mili grubuna taşıyarak performans elde edebilirsiniz (bkz. Dosya ve Dosya Grupları Mimarisi ve SQL Server: yalnızca sistem tabloları için dosya grubu? ).


Bunun sağlam bir tavsiye olduğunu düşünüyorum, ancak IO kurulumu ekli disklere sahip standart bir fiziksel sunucu değilse, örneğin SAN ile sanal örnek veya SSD sürücüler birincil veri dosyalarını ayırmanın fark edilebilir etkisini en aza indirirse, bu durumun çok etkilenmesi olumsuz olacaktır. farklı bir yere, değil mi?
SheldonH

1
Donanım üzerinde kontrolünüz varsa (yani üçüncü bir tarafça barındırılmıyorsanız), SAN'da farklı iğ grupları olabilir (örneğin iki veya daha fazla ayrı RAID-10 birimi). SSD'lerle kullanıyorsanız (veya barındırıyorsanız), iğ yoktur ve IO temel olarak sürücüler ve anakart arasındaki darboğaz (yani SATA, RAID veya NIC kartı, kablolama, yönlendiriciler / anahtarlar) ile sınırlı olacaktır. , SAN, SSDs hız), bu durumda dosyaları ayırarak hiçbir şey kazanmazsınız.
Ziggy Crueltyfree Zeitgeister
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.