SQL Server - Tabel Sementara vs. Fisik

14

Gerakan sedang berlangsung di tempat kerja saya untuk menjauh dari menggunakan tabel #temp dan alih-alih menggunakan tabel fisik permanen dengan SPID. Kapan pun seseorang sebelumnya akan menyisipkan ke tabel #temp, sekarang INSERT INTO dbo.MyPermanentTable (SPID, ...) VALUES (@@SPID, ...)diperlukan - bersama-sama dengan sekelompok DELETE FROM dbo.MyPermanentTable WHERE SPID = @@SPIDpernyataan di awal misalnya prosedur tersimpan. Selain itu, tidak perlu dikatakan bahwa dimanapun 'tabel permanen untuk menyimpan data sementara' ini digunakan, kita harus berhati-hati untuk memasukkan a WHERE SPID = @@SPID.

Logika di balik langkah menuju praktik ini adalah bahwa ia akan meningkatkan kinerja keseluruhan server tempat kueri berjalan (dengan mengurangi I / O dan pertikaian dalam tempdb). Saya tidak tertarik pada pendekatan ini karena sejumlah alasan - itu jelek, berpotensi berbahaya dan sepertinya itu mungkin merusak kinerja pertanyaan-pertanyaan yang menggunakan skema baru.

Apakah ada yang punya pengalaman dengan ini atau pendekatan serupa untuk menghilangkan tabel #temp?

Will A
sumber

Jawaban:

18

Hal ini dapat ditunjukkan dengan mudah bahwa itu tidak akan mengurangi IO atau pertengkaran, tetapi malah meningkatkan keduanya.

  • IO : Setiap baris yang disisipkan, dibaca atau dihapus dari tabel #temp sekarang akan disisipkan, dibaca atau dihapus dari tabel @@ SPID. Tetapi setiap baris akan lebih lebar dengan kolom @@ SPID tambahan, maka jumlah halaman yang dibutuhkan akan sedikit meningkat dan IO akan menjadi sedikit lebih besar. Tetapi yang lebih penting, drop dari tabel #temp dan inisialisasi tabel #temp sesi baru oleh sesi sekarang harus disimulasikan dengan DELETE FROM @@spidTable WHERE spid = @@SPID, dan dengan demikian memotong / membuat operasi (mis. Operasi manajemen tingkat halaman) akan diubah dalam operasi baris, lebih lambat tak tertandingi.
  • Contention : Setiap pemindaian yang menggunakan kunci halaman pada tabel #temp sekarang akan berpotensi untuk mengunci halaman dengan baris spid yang tidak terkait, sehingga menciptakan pertengkaran yang sebelumnya tidak ada. Setiap pembaruan yang melakukan lebih banyak yang mencapai ambang eskalasi kunci memiliki peluang untuk meningkatkan kunci ke kunci tabel dan dengan demikian memblokir setiap spid lainnya.

Jadi, sementara benar bahwa Anda tidak akan mengenai pertikaian mitos IAM / SGAM / GAM di tempdb, satu-satunya alasan mengapa ini akan terjadi adalah karena operasi Anda akan menjadi jauh lebih lambat karena IO ekstra dan pertikaian ekstra biasa.

Remus Rusanu
sumber
Saya sepenuhnya setuju dengan Remus di atas - dan terima kasih atas tanggapan yang sangat baik. Masalahnya adalah bahwa kita menyebabkan kinerja yang seharusnya mengenai aplikasi pihak ketiga (dengan beberapa basis data di server tempat kita memiliki basis data kita sendiri - kita perlu melakukan kueri vs. data mereka). Saya masih berpikir Anda benar, pikiran - I / O bijaksana saya akan mengharapkan pendekatan baru untuk melakukan jauh lebih buruk daripada sebelumnya - pendapat bijak, dari sudut pandang tempdbs hal-hal akan lebih baik - dari kita, agak lebih buruk.
Will A
Berapa banyak file tempdb yang Anda miliki? Pengaturan standar tidak benar-benar skala sama sekali - Anda harus memiliki beberapa file tempdb dan log, satu per inti prosesor yang terlihat (masing-masing 2 jika hyper-v).
TomTom
1
Anda harus membaca dua artikel ini: sqlskills.com/BLOGS/PAUL/post/… dan sqlskills.com/BLOGS/PAUL/post/… karena keduanya membahas masalah skalabilitas tempdb yang paling umum.
Remus Rusanu
@ Tom Tom whoa, whoa. Banyak file log? Betulkah?
Aaron Bertrand
5

Ini sepertinya solusi yang drastis. Ada banyak artikel online tentang mengurangi pertikaian tempdb (dan mengoptimalkan penggunaannya) - sudahkah org Anda memeriksa dengan seksama jalan itu?

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

dll.


sumber
+1 sepenuhnya setuju - optimalkan tempdb, jangan menemukan kembali roda karena implementasi Anda akan lebih buruk. :)
Saya semua tidak mengikuti jalur ini jika tidak dapat dibenarkan - terima kasih atas informasinya Ben - Saya akan menyelidiki dan memberikan saran kepada DBA kami sebagaimana mestinya.
Will A
2

Bagi saya sepertinya Anda harus mengatasi masalah kinerja dalam tempDB, ada beberapa saran di sini

SPE109
sumber
Terlihat bermanfaat - terima kasih SPE109, saya akan memeriksa ini dan membuat rekomendasi untuk DBA kami yang sesuai.
Will A