Küçük bir miktar veri, başka bir planı veya bunun gibi bir şeyi zorlamak için SQL Server'da belirli bir sınıra ulaşabilir. Bu pek olası değil. Ancak diskinizin ağır görev altında olduğu gerçeği beni başka bir sonuca götürüyor.
Yavaşlamanızın 2 olası nedeni vardır.
- Sisteminizi yükselttiniz ve yeniden başlattınız
- İçine bir sürü veri yüklersiniz
Bölüm 1'e bir bakalım.
SQL Server yapılandırmanız bozulmuş olabilir. Bu, Sunucu hızınız ve disk kullanımı ile ilgili ciddi sorunlara neden olabilir.
Lütfen ilk önce temel sunucu ayarlarınızı kontrol edin. Bunlar temel ayarlarıdır max server memory, affinity I/O mask, affinity maskve max degree of parallelism. Düğmesini kullanarak gelişmiş seçenekleri etkinleştirmeniz gerekebilir show advanced options.
İşte tam bir komut dosyası:
-- enable advanced options
EXEC sp_configure 'show advanced options',1
-- apply configuration
RECONFIGURE
-- how much memory can the sql server allocate?
EXEC sp_configure 'max server memory'
-- which cpu is used to run I/O operations
EXEC sp_configure 'affinity I/O mask'
-- which cpus can run processes?
EXEC sp_configure 'affinity mask'
-- how many threads can work on one query part?
EXEC sp_configure 'max degree of parallelism'
Kurulum adımlarınızda sonucu belgelenen değerlerinizle karşılaştırın. Hala aynı mı?
Sunucunuzun bu kadar tuhaf davranmasının birçok nedeni olabilir. Normalde bahse girerim, senin max server memoryyanlış olduğunu. Bu, SQL Server'ınızın veri sayfalarını kalıcı olarak değiştirmesine neden olur. Her şeyi hafızasında tutamaz. Bu, sayfaları diskten okuması, güncellemesi, anında geri yazması gerektiği anlamına gelir. Başka bir güncelleme gelirse ve bir güncelleme için aynı sayfayı kullanırsa, bellekten okunamaz. Bunun yerine sunucunun diskten tekrar okuması gerekir. Sadece değiştiriyorum ...
Başka bir sorun, disk veya işlemlerde yüksek bir afinite olabilir. SQL Server için ayrılmış bir diskle paylaşılan bir Sunucu (SQL Server + diğer hizmetler) kullandıysanız (bu nadir bir durum olabilir, ancak olabilir), bu sizin sorununuz olabilir. Sunucunuz normalde örneğin işlemler için 3 cpus ve G / Ç için bir tane olurdu. Diğer 12 cpus diğer hizmetler için kullanılır. Bu durumda yakınlık maskeniz yanlıştır ve örneğin otomatik bir yapılandırma kullanır. Bu, Sunucunuzun 16 çekirdeğin tamamını işlemler ve G / Ç için dinamik olarak kullandığı anlamına gelir. Çalışan büyük süreçleriniz varsa, diske büyük bir yük koyabilirler, bu disk işlemeyebilir. Ama aslında, bunun senin durumun olduğuna inanmıyorum. Bu geçerliyse (biraz da olsa) daha hızlı olurdu, ancak davanız yavaşlar.
Başka bir sorun çok yüksek bir paralellik derecesi olabilir. Bu, bir sorgunun bir kısmına rölantide çok fazla iş parçacığının olduğu anlamına gelir. Paralellik beklendiği gibi çalışmazsa bu da büyük bir yavaşlamaya neden olabilir. Ancak bu, toplamda yüksek I / O'nuzu tanımlamaz.
Şimdi 2. bölüme de bakalım
Sisteminize bir grup satır yüklersiniz. Bu normal bir iş olsa bile, sorgu planlarınızın arttığı bir sınır oluşturabilir. SQL Server ile birlikte eklemeniz bu davranışı üretir bile olabilir.
Endekslerinizi zaten yardımcı gibi görünen başka bir diske taşımaya çalıştığınızdan bahsettiniz. Bu, yükü iki farklı diske böltüğünüzde olabilir.
Endeksleriniz kırılmış, planlarınız kırılmış veya istatistikleriniz güncelliğini yitirmiş olabilir.
1. istatistiklerin son güncellemesini kontrol edelim
Bunu, her bir istatistik elemanı için arayüz üzerinden manuel olarak yapabilirsiniz. Bu bir acı olur. Veya bu kodu deneyebilirsiniz:
SELECT name AS indexname,
STATS_DATE(OBJECT_ID, index_id) AS StatsUpdated
FROM sys.indexes
Bu, her bir dizin (ve yığın) ve bunların arkasındaki istatistikler hakkında tam bir bilgi verecektir. Çalıştırsanız bile sp_updatestats, istatistiklerin güncellendiği anlamına gelmez. Güncellemenin oldukça zor olduğu kısım, çalıştırsanız sp_updatestatsveya auto update statisticsetkinleştirilmiş olsa bile , istatistikler tam zamanında güncellenmez. Güncelleme gerektiğinde / oluşturulduğunda bazı kenar noktaları şunlardır:
- Boş bir tablo bir veya daha fazla satır alır
- 500'den fazla satırı olan bir tablo% 20 + 500 ek satırı günceller ve daha sonra bir ekleme yapıldı
- 500'den az satır içeren bir tabloda 500 satır değiştirildiğinde
Bu, güncellemeyi çalıştırsanız bile istatistiklerinizin modası geçmiş olabileceği anlamına gelir.
Yukarıdaki sorguya bir göz atabilirsiniz. Bazı tablolarda bazı eski istatistikler bulursanız, bu tablo için manuel bir istatistik güncellemesi çalıştırmak isteyebilirsiniz:
UPDATE STATISTICS dbo.YourBadTable WITH FULLSCAN
Bundan sonra, tüm eski planları atmak için sunucunuza kıçından bir tekme vermek isteyebilirsiniz.
DBCC FREEPROCCACHE
Yalnızca tüm önbellekleri temizlemek istiyorsanız, bunun yerine şunu çalıştırmak isteyebilirsiniz:
DBCC FREESYSTEMCACHE ('ALL')
Bu, yalnızca plan önbelleğini değil, tüm önbellekleri temizler. Normalde bunu üretim aşamasında bir üretim sunucusunda kullanmak için uyarırdım. Ancak sunucunuz şu anda çalışmadığından, onlara çok fazla zarar veremezsiniz. Tüm önbellekleri yeniden oluşturması gerektiğinden birkaç saniye belki 1-2 dakika yavaşlayabilir, ancak bundan sonra doğru planlarla koşmalıdır.
Başka bir neden tamamen parçalanmış endeksler olabilir. Bu, aşağıdaki ifadeyi kullanarak tüm sunucuda kontrol edilebilir:
SELECT *
FROM sys.dm_db_index_physical_stats (NULL, NULL, NULL, NULL, NULL)
Parçalanma çok yüksekse, yeniden organize etmeniz (parçalanma <% 20) veya tamamen yeniden oluşturmanız (>% 20) gerekebilir. Bu, disk üzerinde daha fazla baskı oluşturabilir ve soruna neden olabilir. Öte yandan, eğer endeksler bu kadar kötü ise, muhtemelen sonunda zarardan daha fazla yardımcı olacaktır.
Bu iki nedenin yanında, yine de üçüncü bir sorun olabilir
Sunucunuz muhtemelen yapılandırılmış olabilir, şu anda herhangi bir kodu değiştirmediniz, sadece birkaç satır eklediniz. Tüm istatistikler güncellenir ve tüm önbellekler yeniden oluşturulur. Tüm endeksleriniz onlara ihtiyaç duyduğunuz şekilde yeniden düzenlenir, ancak yine de - hiçbir şey işe yaramaz. Sadece işlemlerinizde kullanılabilir bellek sınırına ulaşmış olabilirsiniz. Belki daha fazlasına ihtiyacınız vardır. Sizden daha fazla bellek almaya çalışan herhangi bir işlem olup olmadığını kontrol edebilirsiniz.
Bu komutu kullanarak bunu kontrol edebilirsiniz:
SELECT * FROM sys.dm_exec_query_memory_grants
Hafıza tüketen tüm oturumların bir listesini sağlayacaktır. Hala bellek almak için bekleyen bazı sorgu olabilir. Bu sorgular kolayca filtrelenebilir. Tüm oturumlar nerede granted_memory_kb IS NULL. Bunlar, bellek isteyen ancak almayan oturumlardır. Başka bir şey, düşük olabilecek bir hafıza olabilir. Sütunları requested_memory_kbile karşılaştırabilirsiniz granted_memory_kb. İstenen, işlemin en iyi şekilde çalışması için gereken bellek miktarını gösterirken, verilen işlem için etkinleştirilen belleği gösterir. Bir işlemin çalışması için 2 GB gerekiyorsa ancak yalnızca 2 MB alırsa ... kendi başınıza alabilirsiniz. ;-)
Başka bir yol da aşağıdakileri kontrol etmektir RESSOURCE_SEMAPHORE:
SELECT * FROM sys.dm_exec_query_resource_semaphore
Sen bir göz alabilir waiter_countve grantee_count. Eğer garson 0'ın üzerindeyse, hafızanızda, swapping'e neden olabilen ve perfmonda gördüğünüz disk basıncına neden olabilecek bir baskı vardır.