Sql server table memasukkan optimasi kinerja


8

Pengaturan

Di rumah dataware, saya bergabung dengan tabel fakta hingga 20 dimensi. Tabel fakta memiliki 32 juta baris dan 30 kolom. Ini adalah tabel sementara sementara jadi saya tidak harus berurusan dengan pengguna lain membaca atau menulis ke meja. Saya memilih 10 kolom dari tabel dasar dan 20 kolom dari dimensi masing-masing. Tabel dimensi kecil (antara 3 dan 15.000 baris). Bidang yang digabungkan adalah bilangan bulat dan nvarchars. Saya menggunakan SELECT ... INTO statement. Tidak ada indeks pada tabel.

Kecepatan eksekusi permintaan ini terlalu lambat untuk berguna.

Solusi yang sudah dicoba

Karena permintaannya terlalu lama untuk diproses, saya mencoba solusi berikut:

  1. Bagi 20 gabungan menjadi 4 bergabung di 5 tabel. Namun kinerja permintaan tetap rendah.
  2. Masukkan indeks pada kolom kunci asing. Tidak ada penurunan waktu yang signifikan.
  3. Pastikan bidang kondisi gabungan bilangan bulat. Saya perhatikan peningkatan kinerja 25%. Tidak cukup apa yang saya cari.
  4. Gunakan masukkan ke dalam pernyataan alih-alih pilih ke. Kinerja lebih buruk karena pertumbuhan file log meskipun database dalam mode pemulihan sederhana.

Temuan ini membuat saya memasukkan rencana pelaksanaan aktual yang menunjukkan bahwa 89% dari biaya terletak pada tabel insert . Biaya lainnya adalah 8% pemindaian tabel pada tabel fakta dan 2% pada pencocokan hash untuk gabungan dalam.

Pertanyaan

  1. Apa alasan yang mungkin dari penyisipan tabel lambat?
  2. Apa cara untuk mengidentifikasi hambatan ini tanpa rencana eksekusi?
  3. Tindakan apa yang bisa saya ambil untuk mengurangi biaya memasukkan tabel?

SELECT INTO adalah tentang metode DML insert tercepat yang ada. Throughput apa yang Anda dapatkan dalam baris / detik dan MB / detik? Mungkin hanya mendekati maksimum yang diharapkan. Versi server apa ini?
usr

Persentase dalam rencana aktual adalah perkiraan, bukan persentase aktual. Menggunakan "statistik io" mungkin mengungkapkan sesuatu yang penting.
James Z

Jawaban:


12

Apa alasan yang mungkin dari penyisipan tabel lambat? Apa cara untuk mengidentifikasi hambatan ini tanpa rencana eksekusi?

Baca Bagaimana menganalisis kinerja SQL Server , khususnya bagian tentang Menganalisis waktu tunggu eksekusi setiap permintaan .

Tindakan apa yang bisa saya ambil untuk mengurangi biaya memasukkan tabel?

Itu akan sangat tergantung pada hasil analisis kinerja. Pertama dan terpenting, pastikan bagian SELECT secepat mungkin. Dengan asumsi bahwa masalahnya adalah insert sepenuhnya yang telah di-threaded, beberapa solusi adalah:


Juga periksa fragmentasi internal dan eksternal jika banyak baris yang tersebar pertama kali dihapus dari tabel.
Ian Ringrose

1

Di bawah ini adalah pengalaman saya dan mungkin membantu orang lain di luar sana.

Kami mencoba mentransfer beberapa data dari satu basis data ke basis data lain yang juga melakukan beberapa transformasi. Menguji transformasi, kami melakukan banyak penyisipan, memperbaiki hal-hal di sepanjang jalan kemudian menghapus untuk menguji masukkan lagi. Namun setelah beberapa sisipan dan memotong kueri kami mulai berjalan lambat dan satu masukkan sederhana mulai memakan waktu hingga 9 menit sementara sebelumnya itu berjalan sekitar 3 menit.

  1. Yah kami mulai melihat mengoptimalkan SELECT pertama. Alih-alih subqueries kami menggunakan #tempTables. Meskipun ini sedikit mempercepat hal itu masih belum memuaskan.
  2. Apa yang membuat semua perbedaan itu dan indeks membangun kembali dan pembaruan statistik pada database tujuan dan yang membawa masuk ke sekitar 2mins.

Jadi cobalah dua strategi ini dan lihat bagaimana ini berhasil untuk Anda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.