Arsip: help: SQL command(s) utk scanning data

 
user image
more 14 years ago

mat_koder

saya punya data dalam tabel , untuk sederhananya adalah WAKTu & BERAT. data ini didapetin dari alat pengukut berat yg data dibaca dan disimpan setiap menit. Saya ingin menentukan kapan alat ini mulai mengukur ( yg ditunjukkan dengan nilai BERAT yg berubah dari 0 menjadi lebih besar dari 0 ) dan kapan alat berhenti mengukur ( yg ditunjukkan oleh nilai BERAT yg berubah dari sesuatu yg lebih besar dari 0 menjadi nol). Tentunya ini dapat dilakukan sengan sequential scanning dari tabel tsb , tapi prosesnya lamaaaa sekali - data yg di-scan bisa ratusan ribu record. Ada ngga yah cara yg lebih cepat dengan menggunakan perintah SQL ?. Asumsikan DB servernya adalah general SQL server ( bisa FB/MYSQL/MSSQL). TIA
user image
more 14 years ago

mat_koder

oh ya... tambahan beban berat ( benda yg diukur ) berubah ubah setiap waktu ( berkali-kali ). yg saya inginkan adalah mengetahui kapan masing-masing beban mulai diukur ( beban ditaruh ke alat pengukur) dan berhenti diukur ( beban dilepaskan dari alat pengukur) . TIA
user image
more 14 years ago

_lmz

Strategi yang lebih baik dari seq. scan berarti menggunakan index? coba: ambil dulu waktu di mana beratnya 0 select waktu from ukuran where berat = 0 misal hasil dari select di atas ada dalam v_waktu_0 lalu ambil waktu di sekitarnya dan periksa secara manual di aplikasi anda apakah waktu itu termasuk awal / akhir pengukuran select u.waktu, u.berat from ukuran u, v_waktu_0 where u.waktu between (v_waktu_0.waktu - toleransi) and (v_waktu_0.waktu + toleransi) Seharusnya select di atas menggunakan index untuk waktu dan berat, juga hasil akhirnya lebih sedikit jumlah barisnya, tapi apakah nanti querynya bisa berjalan lebih cepat masih menjadi tanda tanya, terutama karena query ini menggunakan join... Kalau tidak menggunakan join mungkin bisa dicari waktu di mana beratnya mendekati 0 (diantara 0 - toleransi dan 0 + toleransi). Dengan asumsi toleransi cukup kecil sehingga tidak akan tercapai di dalam pengukuran normal (saat stabil), tapi hanya pada saat transisi dari dan ke 0. mungkin ini lebih mudah jika database anda memiliki fungsi seperti LAG() dan LEAD() untuk melihat nilai di depan dan di belakang baris yang sekarang. Dengan itu maka awal pengukuran dapat didefinisikan sebagai waktu di mana beratnya 0 tapi waktu sesudahnya beratnya > 0. Juga akhir pengukuran adalah waktu di mana beratnya 0 tapi waktu sebelumnya beratnya < 0.
user image
more 14 years ago

simba

Kadang multiple simple query (jauh) lebih cepat daripada single complex query. Saya sering menggunakan teknik ini untuk mempercepat proses pencarian/pencocokan. Apalagi kalo sebagian tugas yg sederhana secara logic tapi jadi beban di db dapat dibantu dilakukan di client. Contoh kasus yg pernah saya hadapi serupa dgn masalah di atas dan saya selesaikan dgn teknik ini. Pencarian berdasarkan waktu dgn melibatkan beberapa tabel, dgn tabel utama berisi lebih dari 2 juta record, prosesnya hampir2 seketika jika menggunakan 6 kali query sederhana yg simultan dan dibantu di client dgn algoritma sederhana, dibanding dgn 1 kali query kompleks yg membutuhkan waktu dalam orde detik (3-5 detik). Tentu saja dgn asumsi desain struktur db juga udah di-optimized seperti yg disampaikan lmz.
user image
more 14 years ago

DelphiExpert

Kalau RDBM yg digunakan support events (misal: Interbase/Firebird), coba deh pake cara ini. Commonly event yg di trigger di sisi client akan di separate dlm sub thread (multithread call). Kombinasikan dng object kecil (cache) di sisi client yg meng-identifikasi id record utk mempercepat pengeksekusian method (mulai dan selesai) mengukur terhadap object/record tersebut (sender) Kalo ngga' mau sequential, ato pake index sekalipun, mungkin cara ini bisa dicoba ;)
user image
more 14 years ago

mat_koder

trims atas respon temen2 skalian. solusi yg skarang saya pake adalah looping perintah SQL. Kayanya ngga ada yag single SQL command utk kasus semacam ini. yg skarang saya gunakan ( Firebird): Query='select first 1 WAKTU from TABLE where BERAT=0 order by WAKTU'; waktu1 = Query.FieldByName(WAKTU). if not Query.Eof begin while not Query.Eof do begin Query := 'select first 1 WAKTU from TABLE where WAKTU > waktu1 and BERAT > 0 order by WAKTU' mulai := Query.FieldByName(WAKTU) Query := 'select first 1 WAKTU from TABLE where WAKTU > mulai and BERAT = 0 order by WAKTU' selesai := Query.FieldByName(WAKTU); waktu1 := selesai end end; tentunya field WAKTU haris di-index. pertanyaan saya berikutnya 1. apa perlu field BERAT juga di-index ? 2. apa clause 'order by WAKTU' diperlukan ? TIA
more ...
  • Pages:
  • 1
Share to

Random Topic

Local Business Directory, Search Engine Submission & SEO Tools FreeWebSubmission.com SonicRun.com