Bagaimana saya bisa mengidentifikasi kapan membuat tabel baru untuk menyimpan data yang dapat diperoleh dari kueri?

8

Kami memiliki tabel pembayaran, dan agen mendapatkan komisi pembayaran. Komisi didasarkan pada beberapa faktor yang berbeda, seperti berapa lama waktu yang dibutuhkan untuk mendapatkan pembayaran, sehingga ada beberapa perhitungan yang terlibat ketika menentukan tingkat komisi yang didapat agen, tetapi tidak ada yang rumit.

Misalnya, mungkin tidak akan pernah lebih kompleks dari ini:

SELECT Payments.Amount * CASE 
    WHEN DateDiff(year, Client.Received, Payments.DatePaid) = 1 THEN Rates.Rate1
    WHEN DateDiff(year, Client.Received, Payments.DatePaid) = 2 THEN Rates.Rate2
    ELSE Rates.Rate3 END

Apakah masuk akal untuk membangun tabel ke-2 untuk menyimpan data ini alih-alih menanyakannya kapan saja dibutuhkan? Atau haruskah saya tetap dengan kueri run-time yang menarik data kapan pun itu diminta?

Dan yang lebih penting, faktor-faktor apa yang digunakan ketika menentukan apakah kueri harus dijalankan kapan saja data diperlukan, atau jika data harus disimpan dalam tabel terpisah miliknya sendiri?

Rachel
sumber
2
Satu pertanyaan kunci adalah 'seberapa sering orang ingin menanyakan data ini?' Apakah itu laporan, atau layar yang sangat diperdagangkan dalam aplikasi?
ConcernedOfTunbridgeWells
@ConcernedOfTunbridgeWells Dalam kasus ini, ini adalah laporan yang berjalan beberapa kali dalam sebulan, mungkin lebih sering jika kita membiarkan agen menjalankan laporan sendiri untuk melihat komisi mereka.
Rachel
Mungkin yang terbaik untuk membangunnya menjadi tabel pelaporan pada proses semalam, dan komisi adalah 'pada malam terakhir'. Jika Anda memiliki proses penutupan di mana Anda harus menutup lalu laporkan maka Anda dapat menyediakan fasilitas di aplikasi untuk memaksa membangun kembali.
ConcernedOfTunbridgeWells
Tanggal "AsOf" cukup umum dengan jenis operasi ini dalam konteks keuangan, menurut pengalaman saya. Dengan demikian, sebuah tabel (seperti catatan @ConcernedOfTunbridgeWells) dengan tanggal "AsOf" harus diterima dengan sempurna.
swasheck
Posting terkait: dba.stackexchange.com/q/7592/2660
Nick Chammas

Jawaban:

8

Jika kueri dijalankan jarang (misalnya laporan) maka membangun tabel dengan cepat mungkin lebih baik 1 . Jika kueri sering dijalankan dan tabel temp diperlukan untuk kinerja maka Anda berpotensi memiliki masalah.

  • Jika meja murah untuk dibangun, maka lakukan sebagai tabel temp. Selama database cukup cepat Anda bisa lolos begitu saja. Namun Anda perlu mengawasi kinerja.

  • Jika tabel tidak harus benar-benar terkini tetapi akan menjadi subjek kegiatan pelaporan yang relatif sering daripada membangun kembali secara berkala mungkin adalah cara terbaik untuk pergi.

  • Jika tabel mahal untuk dibuat tetapi perlu diperbarui, Anda mungkin perlu mengelolanya sebagai struktur yang dinormalisasi, baik dipertahankan sebagai tampilan yang diindeks atau melalui pemicu. Ini agak lebih rumit dan menempatkan beban tambahan pada operasi penulisan.

    Dalam kasus yang lebih ekstrem (yaitu volume data besar), Anda mungkin memerlukan pendekatan hibrid di mana data historis ditanyakan dari struktur yang dinormalisasi yang dioptimalkan untuk kinerja dan data saat ini ditanyakan dari aplikasi langsung.

    Kasus-kasus yang paling ekstrem dari hal ini dapat membawa Anda ke data data feed latensi rendah dan solusi OLAP hibrid, jadi ini sejauh ini yang paling kompleks dalam hal seberapa dalam lubang kelinci bisa masuk. Sebaiknya dihindari kecuali Anda memiliki persyaratan asli.

Dalam kasus yang Anda jelaskan di atas, rekondisi berkala tabel pelaporan terdengar tepat. Jika Anda perlu menutup di tengah hari untuk menjalankan laporan, maka Anda dapat menyediakan fasilitas untuk memaksa pembaruan dari aplikasi. Kalau tidak, jalankan pada proses semalam dan agen dapat melihat komisi mereka 'pada tengah malam pada hari kerja sebelumnya.'

1 select into kueri membuat tabel temp cukup cepat di SQL Server karena operasi penyisipan dicatat secara minimal.

Jadi untuk meringkas, Anda menggunakan faktor-faktor berikut untuk menentukan apakah Anda harus memiliki tabel baru untuk data Anda atau tidak:

  • Seberapa sering data dibutuhkan
  • Betapa mahal untuk mendapatkan data
  • Seberapa up-to-date data perlu
ConcernedOfTunbridgeWells
sumber
1
Jadi pada dasarnya hanya dua faktor yang Anda gunakan dalam menentukan apakah Anda memerlukan tabel permanen untuk data alih-alih menanyakannya saat dibutuhkan, how often the data is neededdan how expensive the query is?
Rachel
2
@Rachel - Juga, 'seberapa terbaru data perlu?'
ConcernedOfTunbridgeWells
9

Satu masalah yang tidak tercakup dalam jawaban yang diterima adalah "apakah Anda memerlukan nilai ini dari waktu ke waktu" dan "akankah rumusnya berubah".

Misalnya perhatikan contoh komisi. Jika komisi dibayarkan, jumlah tersebut harus disimpan karena itu adalah angka historis dari apa yang sebenarnya dibayarkan. Cara menghitung komisi dapat berubah bulan depan (dan sering kali demikian) tetapi itu tidak akan mengubah apa yang sebenarnya dibayarkan yang harus disimpan secara terpisah.

Ini adalah ide yang sama dengan menyimpan harga yang sebenarnya dibayar oleh pelanggan untuk suatu produk (setelah perhitungan diskon, dll.) Daripada mengandalkan formula terhadap tabel harga untuk melakukan apa pun kecuali perhitungan awal karena harga produk bulan depan mungkin tidak sama dengan harga saat pelanggan melakukan pemesanan.

Jika Anda memerlukan catatan historis tentang berapa nilainya pada suatu saat, selalu simpan nilainya setelah menggunakan rumus untuk perhitungan awal.

HLGEM
sumber
Terima kasih, itu pasti sesuatu yang perlu dipertimbangkan ketika membuat keputusan semacam ini. Kali ini, nilainya tidak akan berubah karena tingkat komisi ditetapkan satu kali per agen dan per klien ketika klien diperoleh, dan nilai yang digunakan didasarkan pada tanggal pembayaran dan tanggal kami menerima klien, yang keduanya tidak adalah nilai yang berubah.
Rachel
@Rachel - Tak satu pun dari nilai-nilai yang saat ini Anda rencanakan untuk berubah. Tentu saja, jika mereka melakukan perubahan Anda selalu dapat membuat tabel data historis pada waktu itu, jika Anda membutuhkannya, asalkan Anda tidak lupa tentang masalah ini.
psr
0

Mungkin tidak menarik jika Anda dikunci ke dalam basis data tertentu, tetapi MariaDB (yang berbasis pada MySQL) memiliki sesuatu yang luar biasa yang disebut "kolom virtual" yang dapat dihitung secara langsung atau di-cache dalam penyimpanan aktual, tetapi secara otomatis dihitung ulang sesuai kebutuhan. Saya melewatkan fungsi ini sejak saya meninggalkan FileMaker Pro untuk dunia SQL bertahun-tahun yang lalu ...

Jan Steinman
sumber