Berikut adalah daftar hal-hal praktis yang selalu saya berikan kepada seseorang yang bertanya kepada saya tentang pengoptimalan.
Kami terutama menggunakan Sybase, tetapi sebagian besar saran akan diterapkan secara menyeluruh.
SQL Server, misalnya, hadir dengan sejumlah bit pemantauan / penyetelan kinerja, tetapi jika Anda tidak memiliki yang seperti itu (dan mungkin bahkan jika Anda memilikinya), saya akan mempertimbangkan yang berikut ini...
99% masalah Saya telah melihat disebabkan oleh menempatkan terlalu banyak tabel dalam gabungan . Perbaikan untuk ini adalah dengan melakukan setengah gabungan (dengan beberapa tabel) dan menyimpan hasil dalam tabel sementara. Kemudian lakukan sisa kueri yang bergabung di tabel sementara itu.
Daftar Periksa Pengoptimalan Kueri
- Jalankan STATISTIK PEMBARUAN pada tabel yang mendasarinya
- Banyak sistem menjalankan ini sebagai tugas mingguan terjadwal
- Hapus catatan dari tabel yang mendasarinya (mungkin arsipkan catatan yang dihapus)
- Pertimbangkan untuk melakukannya secara otomatis sekali sehari atau seminggu sekali.
- Membangun Kembali Indeks
- Membangun Ulang Tabel (data bcp keluar/masuk)
- Buang / Muat ulang database (drastis, tetapi mungkin memperbaiki kerusakan)
- Buat indeks baru yang lebih sesuai
- Jalankan DBCC untuk melihat apakah ada kemungkinan kerusakan pada database
- Kunci / Kebuntuan
- Pastikan tidak ada proses lain yang berjalan di database
- Khususnya DBCC
- Apakah Anda menggunakan penguncian tingkat baris atau halaman?
- Kunci tabel secara eksklusif sebelum memulai kueri
- Periksa apakah semua proses mengakses tabel dalam urutan yang sama
- Pastikan tidak ada proses lain yang berjalan di database
- Apakah indeks digunakan dengan tepat?
- Bergabung hanya akan menggunakan indeks jika kedua ekspresi adalah tipe data yang sama persis
- Indeks hanya akan digunakan jika bidang pertama pada indeks cocok dengan kueri
- Apakah indeks berkerumun digunakan jika sesuai?
- data jangkauan
- di MANA bidang antara nilai1 dan nilai2
- Bergabung Kecil adalah Bergabung yang Menyenangkan
- Secara default, pengoptimal hanya akan mempertimbangkan tabel 4 sekaligus.
- Ini berarti bahwa jika digabungkan dengan lebih dari 4 tabel, memiliki peluang bagus untuk memilih paket kueri yang tidak optimal
- Memutus Gabung
- Bisakah Anda memutuskan sambungan?
- Pra-pilih kunci asing ke dalam tabel sementara
- Lakukan setengah gabungan dan taruh hasilnya di tabel sementara
- Apakah Anda menggunakan tabel sementara yang tepat?
#temp
tabel mungkin berkinerja jauh lebih baik daripada@table
variabel dengan volume besar (ribuan baris).
- Mempertahankan Tabel Ringkasan
- Buat dengan pemicu pada tabel yang mendasarinya
- Buat setiap hari / setiap jam / dll.
- Membangun ad-hoc
- Bangun secara bertahap atau meruntuhkan / membangun kembali
- Lihat apa rencana kueri dengan SET SHOWPLAN ON
- Lihat apa yang sebenarnya terjadi dengan SET STATS IO ON
- Memaksa indeks menggunakan pragma:(index:myindex)
- Paksa urutan tabel menggunakan SET FORCEPLAN ON
- Pengendus Parameter:
- Pisahkan Stored Procedure menjadi 2
- panggil proc2 dari proc1
- memungkinkan pengoptimal untuk memilih indeks di proc2 jika @parameter telah diubah oleh proc1
- Dapatkah Anda meningkatkan perangkat keras Anda?
- Jam berapa kamu lari? Apakah ada waktu yang lebih tenang?
- Apakah Server Replikasi (atau proses non-stop lainnya) berjalan? Bisakah Anda menangguhkannya? Jalankan mis. per jam?