SQL Server - Geçici ve Fiziksel Tablolar


14

İstihdam yaptığım yerde #temp tablolarını kullanmaktan uzaklaşmak ve bunun yerine SPID'lerle kalıcı fiziksel tablolar kullanmak için bir hareket var. Ne zaman daha önce bir #temp tablosuna INSERTed zaman, şimdi bir INSERT INTO dbo.MyPermanentTable (SPID, ...) VALUES (@@SPID, ...)gereklidir - DELETE FROM dbo.MyPermanentTable WHERE SPID = @@SPIDörneğin bir saklı yordamın başlangıcında bir sürü ifade ile birlikte . Ayrıca, bu 'geçici verilerin depolanması için kalıcı tabloların' kullanıldığı her yerde, a WHERE SPID = @@SPID.

Bu uygulamaya doğru hareketin arkasındaki mantık, sorguların çalıştığı sunucunun genel performansını artıracağıdır (I / O ve tempdb'deki çekişmeyi azaltarak). Birkaç nedenden dolayı bu yaklaşıma meraklı değilim - çirkin, potansiyel olarak tehlikeli ve yeni şemayı kullanan sorguların performansına iyi zarar verebileceği anlaşılıyor.

#Temp tablolarını ortadan kaldırmak için bu veya benzeri yaklaşımlarla ilgili herhangi bir deneyimi olan var mı?

Yanıtlar:


18

ES'yi veya çekişmeyi azaltmayacağı, bunun yerine her ikisini de arttıracağı kolayca gösterilebilir .

  • IO : #temp tablosundan eklenen, okunan veya silinen her satır şimdi @@ SPID tablosuna eklenecek, okunacak veya silinecektir. Ancak, her satır ek bir @@ SPID sütunu ile daha geniş olacak, bu nedenle gerekli sayfa sayısı biraz artacak ve IO her zamankinden biraz daha fazla olacaktır. Ancak daha da önemlisi, #temp tablosunun düşmesi ve yeni bir oturumun #temp tablosunun bir oturum tarafından başlatılması artık bir a ile simüle edilmeli DELETE FROM @@spidTable WHERE spid = @@SPIDve böylece kısal / yarat işlemi (sayfa genişliği yönetimi işlemleri) dönüştürülecektir. satır işlemlerinde, kıyaslanamayacak kadar yavaştır.
  • Dikkat : #temp tablosundaki sayfa kilitlerini kullanan her tarama artık alakasız örümcek satırları olan bir sayfayı kilitleme ve böylece daha önce var olmayan çekişme oluşturma potansiyeline sahip olacaktır. Kilit yükseltme eşiğine fazlasını yapar Her güncelleme tablo kilidi kilidi iletin ve böylece engelleme fırsatına sahip her diğer spid.

Bu nedenle, tempdb'deki efsanevi IAM / SGAM / GAM çekişmesine vurmayacağınız doğru olsa da, bunun olmasının tek nedeni, sıradan ekstra IO ve ekstra çekişme nedeniyle işlemlerinizin daha yavaş hale gelmesidir.


Yukarıdaki Remus'a tamamen katılıyorum - ve mükemmel bir yanıt için teşekkürler. Sorun şu ki, üçüncü taraf uygulamalarında sözde performans isabetine neden oluyoruz (kendi veritabanımız olan bir sunucuda çeşitli veritabanları ile - sorgulara karşı verilerini gerçekleştirmemiz gerekiyor). Hala haklı olduğunu düşünüyorum, zihin - G / Ç bilge Yeni yaklaşımın eskisinden çok daha kötü performans göstermesini beklerdim - çekişmeli olarak, tempdbs açısından işler daha iyi olacak - bizimkinden biraz daha kötü.
Will A

Kaç tane tempdb dosyanız var? Standart kurulum gerçekten ölçeklenmez - görünür işlemci çekirdeği başına bir tane olmak üzere (her biri hiper-v ise 2) birden fazla tempdb dile ve log dosyalarına sahip olmalısınız.
TomTom

1
Bu iki makaleyi okumalısınız: sqlskills.com/BLOGS/PAUL/post/… ve sqlskills.com/BLOGS/PAUL/post/… en yaygın tempdb ölçeklenebilirlik sorunlarını ele aldıkları için.
Remus Rusanu

@TomTom whoa, whoa. Birden fazla günlük dosyası mı? Gerçekten mi?
Aaron Bertrand

5

Bu ciddi bir çözüm gibi görünüyor. Tempdb çekişmesini azaltma (ve kullanımını optimize etme) hakkında birçok makale çevrimiçi - kuruluşunuz bu caddeyi iyice inceledi mi?

http://www.sql-server-performance.com/tips/tempdb_p1.aspx

http://www.sqlservercentral.com/blogs/robert_davis/archive/2010/03/05/Breaking-Down-TempDB-Contention.aspx

http://searchsqlserver.techtarget.com/tip/Optimize-tempdb-in-SQL-Server-by-striping-and-splitting-to-multiple-files

vb.


+1 tamamen katılıyorum - tempdb'yi optimize edin, uygulamanız daha kötü olacağından tekerleği yeniden icat etmeyin. :)

Eğer haklı değilse bu yolu takip etmiyorum - Ben bilgi için teşekkürler - DBA'mızı uygun şekilde araştıracağım ve öneride bulunacağım.
Will A

2

TempDB içindeki performans sorunlarını gidermeniz gerektiği gibi geliyor, burada birkaç öneri var


Yararlı görünüyor - teşekkürler SPE109, bunu kontrol edeceğim ve uygun şekilde DBA'mıza önerilerde bulunacağım.
Will A
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.