Saat melakukan kueri hitung (agregat) SQL, apa yang dapat mempercepat waktu eksekusi dalam 3 sistem basis data ini? Saya yakin banyak hal dapat mempercepatnya (perangkat keras untuk satu), tapi saya hanya seorang DBA pemula, jadi saya yakin saya akan mendapatkan beberapa jawaban di sini. Saya memigrasi sekitar 157 juta baris ke basis data SQL Server, dan kueri ini memakan waktu selamanya. Tetapi dalam basis data sumber saya Netezza, dibutuhkan beberapa detik.
Sebagai contoh:
Netezza 6:
SELECT COUNT(*) FROM DATABASENAME..MYTABLE
Oracle 11g:
SELECT COUNT(*) FROM MYTABLE
SQL Server 2012:
SELECT COUNT(*) FROM DATABASENAME.[dbo].[MYTABLE]
sql-server
query-performance
count
netezza
MacGyver
sumber
sumber
Jawaban:
Netezza adalah alat yang dirancang untuk unggul dalam pemindaian meja besar, jadi itu sebabnya Anda mendapatkan hasil yang begitu cepat pada sistem itu.
Untuk SQL Server Anda, Anda dapat mempercepat penghitungan baris dengan meminta dari sys.dm_db_partition_stats DMV.
Dalam lingkungan transaksi yang tinggi, DMV ini tidak dijamin akurat 100%. Tetapi dari pertanyaan Anda, sepertinya Anda hanya melakukan penghitungan baris untuk memverifikasi setiap tabel setelah migrasi Anda, jadi pertanyaan ini seharusnya cocok untuk Anda.
sumber
Berikut adalah solusi SQL Server yang menggunakan
COUNT_BIG
di dalam tampilan yang diindeks. Ini akan memberi Anda penghitungan yang konsisten secara transaksi tanpa overhead dari tabel besar atau pemindaian indeks, dan tanpa perlu penyimpanan yang diperlukan untuk yang terakhir:Ini akan memerlukan pemindaian awal tunggal (tidak ada jalan keluar dari ini), dan menambahkan sedikit overhead untuk manipulasi data tabel tambahan. Jika Anda melakukan operasi besar dengan banyak data (berbeda dengan banyak operasi kecil), saya pikir biaya tambahan pada perubahan harus diabaikan.
sumber
Di Oracle, indeks pohon biner pada kolom NOT NULL dapat digunakan untuk menjawab COUNT (*). Dalam kebanyakan kasus akan lebih cepat daripada FULL TABLE SCAN karena indeks biasanya lebih kecil dari tabel dasar mereka.
Namun, indeks pohon biner biasa masih akan besar dengan 157 Mrows. Jika tabel Anda tidak diperbarui secara bersamaan (mis. Hanya proses pemuatan batch), maka Anda mungkin ingin menggunakan indeks bitmap sebagai gantinya.
Indeks bitmap terkecil akan menjadi seperti ini:
Entri kosong diperhitungkan oleh indeks bitmap. Indeks yang dihasilkan akan kecil (20-30 8k blok per juta baris) dibandingkan dengan indeks pohon biner biasa atau tabel dasar.
Rencana yang dihasilkan harus menunjukkan operasi berikut:
Jika tabel Anda diperbarui secara bersamaan, indeks bitmap dengan nilai unik akan menjadi titik pertikaian dan tidak boleh digunakan.
sumber
Di Oracle, kueri hitung sederhana sering dijalankan dengan memindai indeks alih-alih seluruh tabel. Indeks harus indeks bitmap atau didefinisikan pada kolom dengan batasan NOT NULL. Untuk kueri yang lebih kompleks yang memerlukan pemindaian tabel penuh, Anda bisa menggunakan kueri paralel.
Untuk mengaktifkan kueri paralel (diperlukan Edisi Perusahaan), Anda dapat menggunakan petunjuk pengoptimal:
Atau aktifkan kueri paralel untuk semua kueri di atas meja:
sumber