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:
- Bagi 20 gabungan menjadi 4 bergabung di 5 tabel. Namun kinerja permintaan tetap rendah.
- Masukkan indeks pada kolom kunci asing. Tidak ada penurunan waktu yang signifikan.
- Pastikan bidang kondisi gabungan bilangan bulat. Saya perhatikan peningkatan kinerja 25%. Tidak cukup apa yang saya cari.
- 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
- Apa alasan yang mungkin dari penyisipan tabel lambat?
- Apa cara untuk mengidentifikasi hambatan ini tanpa rencana eksekusi?
- Tindakan apa yang bisa saya ambil untuk mengurangi biaya memasukkan tabel?
sumber
Jawaban:
Baca Bagaimana menganalisis kinerja SQL Server , khususnya bagian tentang Menganalisis waktu tunggu eksekusi setiap permintaan .
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:
Gunakan sakelar partisi untuk memindahkan data 'in'. Sejauh ini, ini adalah solusi terbaik. Siapkan data pementasan dalam tabel pementasan terpisah, lalu alihkan tabel pementasan ini ke dalam tabel DW. Baca Mentransfer Data secara Efisien dengan Menggunakan Partition Switching .
Pastikan INSERT ter-log minimal. Baca Operasi yang Dapat Dicatat Minimal dan Prasyarat untuk Pencatatan Minimal . Bahkan jika Anda menggunakan operasi sakelar partisi, masih layak untuk memastikan build dari staging table minimal dicatat.
Pastikan subsistem IO Anda mampu mengendarai muatan cepat. Baca Memperkenalkan SSD .
sumber
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.
Jadi cobalah dua strategi ini dan lihat bagaimana ini berhasil untuk Anda.
sumber