Rumah >pangkalan data >tutorial mysql >Bagaimanakah Pangsi Berbilang Lajur Boleh Dicapai Dengan Cekap Menggunakan `tablefunc` PostgreSQL untuk Set Data Besar?
Mengoptimumkan tablefunc
PostgreSQL untuk Pemisingan Berbilang Lajur Set Data Besar
Penukaran set data yang besar dengan cekap daripada format panjang kepada lebar (berputar) adalah penting untuk analisis data. Artikel ini menangani cabaran dan penyelesaian menggunakan sambungan tablefunc
PostgreSQL untuk pangsi berbilang lajur, terutamanya apabila berurusan dengan berbilion baris.
Menangani Cabaran Pivoting
Masalah biasa melibatkan data berputar dengan berbilang pembolehubah menggunakan tablefunc
. Contohnya, menukar data dengan lajur seperti time
, entity
, status
dan measurement
kepada format yang luas di mana setiap nilai measurement
menduduki lajur yang berasingan.
Mengenalpasti Punca Ketidakcekapan
Sumber utama ketidakcekapan selalunya berpunca daripada susunan lajur yang salah dalam pertanyaan tablefunc
. Fungsi crosstab
menjangkakan susunan tertentu: pengecam baris (mendefinisikan pemisahan data) mestilah lajur pertama, diikuti dengan mana-mana lajur tambahan dan akhirnya, nilai yang akan dipangsi. Pesanan yang salah, seperti menukar lajur time
dan entity
, membawa kepada salah tafsir pengecam baris, yang memberi kesan ketara kepada prestasi.
Penyelesaian: Susunan Lajur yang Betul
Penyelesaian melibatkan penyusunan semula lajur dengan teliti untuk mematuhi keperluan crosstab
. Contoh di bawah menunjukkan pembetulan ini, dengan entity
ialah pengecam baris dan timeof
ialah lajur tambahan:
<code class="language-sql">crosstab( 'SELECT entity, timeof, status, ct FROM t4 ORDER BY 1,2,3' ,$$VALUES (1::text), (0::text)$$)</code>
Contoh Ilustrasi dan Output
Contoh ini mempamerkan pertanyaan yang disemak, menggunakan dense_rank()
untuk memastikan pengecam baris yang unik dan generate_series
untuk mentakrifkan bilangan lajur berpangsi:
<code class="language-sql">SELECT localt, entity , msrmnt01, msrmnt02, msrmnt03, msrmnt04, msrmnt05 -- , more? FROM crosstab( 'SELECT dense_rank() OVER (ORDER BY localt, entity)::int AS row_name , localt, entity , msrmnt, val FROM test ORDER BY localt, entity, msrmnt' , 'SELECT generate_series(1,5)' ) AS ct (row_name int, localt timestamp, entity int , msrmnt01 float8, msrmnt02 float8, msrmnt03 float8, msrmnt04 float8, msrmnt05 float8 );</code>
Pendekatan yang diperbetulkan ini memastikan pangsi berbilang lajur yang cekap dengan tablefunc
, walaupun untuk set data yang sangat besar. Susunan lajur yang betul adalah penting untuk prestasi optimum.
Atas ialah kandungan terperinci Bagaimanakah Pangsi Berbilang Lajur Boleh Dicapai Dengan Cekap Menggunakan `tablefunc` PostgreSQL untuk Set Data Besar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!