Cara menggunakan latensi postgresql
Skrip transaksi bawaan bawaan (juga dipanggil dengan \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END6) mengeluarkan tujuh perintah per transaksi melalui \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END7, \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END8, \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END9 dan \sleep 10 ms0 yang dipilih secara acak. Skenario ini terinspirasi oleh tolok ukur TPC-B, tetapi sebenarnya bukan TPC-B, karena itulah namanya Show
Jika Anda memilih \sleep 10 ms8 bawaan (juga \sleep 10 ms9), langkah 4 dan 5 tidak termasuk dalam transaksi. Ini akan menghindari pertikaian pembaruan pada tabel-tabel ini, tetapi itu membuat kasus uji menjadi kurang seperti TPC-B Jika Anda memilih \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon0 bawaan (juga \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon1), hanya \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon2 yang dikeluarkan Script KustomCatatanDiasumsikan bahwa skrip pgbench tidak berisi blok transaksi SQL yang tidak lengkap. Jika saat runtime klien mencapai akhir skrip tanpa menyelesaikan blok transaksi terakhir, itu akan dibatalkan Tabel 288. pgbench Variabel Otomatis VariableDescription \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon3nomor unik yang mengidentifikasi sesi klien (dimulai dari nol) \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon4seed digunakan dalam fungsi permutasi hash dan pseudorandom secara default \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon5seed generator acak (kecuali ditimpa dengan \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon6) \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon7faktor skala saat ini Perintah meta file skrip dimulai dengan garis miring terbalik ( \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon8) dan biasanya diperpanjang hingga akhir baris, meskipun dapat dilanjutkan ke baris tambahan dengan menulis garis miring terbalik-kembali. Argumen ke perintah meta dipisahkan oleh spasi putih. Perintah meta ini didukung \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_9] \shell command literal_argument :variable ::literal_starting_with_colon0] Perintah ini dapat digunakan untuk mengakhiri kueri SQL, menggantikan titik koma akhir ( \shell command literal_argument :variable ::literal_starting_with_colon1) Saat perintah \shell command literal_argument :variable ::literal_starting_with_colon2 digunakan, kueri SQL sebelumnya diharapkan mengembalikan satu baris, kolom yang disimpan ke dalam variabel yang dinamai menurut nama kolom, dan diawali dengan \shell command literal_argument :variable ::literal_starting_with_colon3 jika disediakan Saat perintah \shell command literal_argument :variable ::literal_starting_with_colon_4 digunakan, semua kueri SQL gabungan (dipisahkan oleh \shell command literal_argument :variable ::literal_starting_with_colon5) kolomnya disimpan ke dalam variabel yang dinamai menurut nama kolom, dan diawali dengan \shell command literal_argument :variable ::literal_starting_with_colon3 jika disediakan. Jika kueri tidak mengembalikan baris, tidak ada tugas yang dibuat dan variabel dapat diuji keberadaannya untuk mendeteksinya. Jika kueri mengembalikan lebih dari satu baris, nilai terakhir disimpan \shell command literal_argument :variable ::literal_starting_with_colon2 dan \shell command literal_argument :variable ::literal_starting_with_colon4 tidak dapat digunakan dalam mode pipa, karena hasil kueri belum tersedia pada saat perintah memerlukannya Contoh berikut menempatkan saldo akun akhir dari kueri pertama ke dalam variabel \shell command literal_argument :variable ::literal_starting_with_colon9, dan mengisi variabel \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)0 dan \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)1 dengan bilangan bulat dari kueri ketiga. Hasil kueri kedua dibuang. Hasil dari dua kueri gabungan terakhir disimpan dalam variabel \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)2 dan \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)3 UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid RETURNING abalance \gset -- compound of two queries SELECT 1 \; SELECT 2 AS two, 3 AS three \gset p_ SELECT 4 AS four \; SELECT 5 AS five \aset \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)4 \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)5 \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)6 \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)5 \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)8 \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)_9 Grup perintah ini mengimplementasikan blok bersyarat yang dapat disarangkan, mirip dengan \set k1 1 + permute(:r, :size, :default_seed + 123) \set k2 1 + permute(:r, :size, :default_seed + 321)0. Ekspresi bersyarat identik dengan \set k1 1 + permute(:r, :size, :default_seed + 123) \set k2 1 + permute(:r, :size, :default_seed + 321)3, dengan nilai bukan nol yang ditafsirkan sebagai benar \set k1 1 + permute(:r, :size, :default_seed + 123) \set k2 1 + permute(:r, :size, :default_seed + 321)4 \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)5 Menetapkan variabel \set k1 1 + permute(:r, :size, :default_seed + 123) \set k2 1 + permute(:r, :size, :default_seed + 321)_6 ke nilai yang dihitung dari \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)5. Ekspresi dapat berisi konstanta \set k1 1 + permute(:r, :size, :default_seed + 123) \set k2 1 + permute(:r, :size, :default_seed + 321)8, konstanta Boolean \set k1 1 + permute(:r, :size, :default_seed + 123) \set k2 1 + permute(:r, :size, :default_seed + 321)9 dan \set size 1000000 \set r random_zipfian(1, 100 * :size, 1.07) \set k 1 + abs(hash(:r)) % :size0, konstanta bilangan bulat seperti \set size 1000000 \set r random_zipfian(1, 100 * :size, 1.07) \set k 1 + abs(hash(:r)) % :size1, konstanta ganda seperti \set size 1000000 \set r random_zipfian(1, 100 * :size, 1.07) \set k 1 + abs(hash(:r)) % :size2, referensi ke variabel \set size 1000000 \set r random_zipfian(1, 100 * :size, 1.07) \set k 1 + abs(hash(:r)) % :size3 \set size 1000000 \set r random_zipfian(1, 100 * :size, 1.07) \set k 1 + abs(hash(:r)) % :size4, dengan prioritas dan asosiatif SQL yang biasa, SQL dan asosiatif, Fungsi dan sebagian besar operator menampilkan \set k1 1 + permute(:r, :size, :default_seed + 123) \set k2 1 + permute(:r, :size, :default_seed + 321)_8 pada input \set k1 1 + permute(:r, :size, :default_seed + 123) \set k2 1 + permute(:r, :size, :default_seed + 321)8 Untuk tujuan bersyarat, nilai numerik bukan nol adalah \set k1 1 + permute(:r, :size, :default_seed + 123) \set k2 1 + permute(:r, :size, :default_seed + 321)9, nilai numerik nol dan \set k1 1 + permute(:r, :size, :default_seed + 123) \set k2 1 + permute(:r, :size, :default_seed + 321)8 adalah \set size 1000000 \set r random_zipfian(1, 100 * :size, 1.07) \set k 1 + abs(hash(:r)) % :size0 Konstanta bilangan bulat dan ganda yang terlalu besar atau kecil, serta operator aritmatika bilangan bulat ( \set aid random(1, 100000 * :scale) \set bid random(1, 1 * :scale) \set tid random(1, 10 * :scale) \set delta random(-5000, 5000) BEGIN; UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; SELECT abalance FROM pgbench_accounts WHERE aid = :aid; UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); END;1, \set aid random(1, 100000 * :scale) \set bid random(1, 1 * :scale) \set tid random(1, 10 * :scale) \set delta random(-5000, 5000) BEGIN; UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; SELECT abalance FROM pgbench_accounts WHERE aid = :aid; UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); END;2, \set aid random(1, 100000 * :scale) \set bid random(1, 1 * :scale) \set tid random(1, 10 * :scale) \set delta random(-5000, 5000) BEGIN; UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; SELECT abalance FROM pgbench_accounts WHERE aid = :aid; UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); END;3 dan \set aid random(1, 100000 * :scale) \set bid random(1, 1 * :scale) \set tid random(1, 10 * :scale) \set delta random(-5000, 5000) BEGIN; UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; SELECT abalance FROM pgbench_accounts WHERE aid = :aid; UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); END;4) meningkatkan kesalahan pada luapan Ketika tidak ada klausa \set aid random(1, 100000 * :scale) \set bid random(1, 1 * :scale) \set tid random(1, 10 * :scale) \set delta random(-5000, 5000) BEGIN; UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; SELECT abalance FROM pgbench_accounts WHERE aid = :aid; UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); END;5 akhir yang diberikan ke \set size 1000000 \set r random_zipfian(1, 100 * :size, 1.07) \set k 1 + abs(hash(:r)) % :size5, nilai defaultnya adalah \set k1 1 + permute(:r, :size, :default_seed + 123) \set k2 1 + permute(:r, :size, :default_seed + 321)8 Contoh \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END________63______8 [kita. hal. s ] Menyebabkan eksekusi skrip untuk tidur selama durasi yang ditentukan dalam mikrodetik ( \set aid random(1, 100000 * :scale) \set bid random(1, 1 * :scale) \set tid random(1, 10 * :scale) \set delta random(-5000, 5000) BEGIN; UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; SELECT abalance FROM pgbench_accounts WHERE aid = :aid; UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); END;9), milidetik ( 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26630) atau detik ( 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26631). Jika unit dihilangkan maka detik adalah defaultnya. 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 2663_2 dapat berupa konstanta bilangan bulat atau \set size 1000000 \set r random_zipfian(1, 100 * :size, 1.07) \set k 1 + abs(hash(:r)) % :size3 \set size 1000000 \set r random_zipfian(1, 100 * :size, 1.07) \set k 1 + abs(hash(:r)) % :size4 referensi ke variabel yang memiliki nilai bilangan bulat Contoh \sleep 10 ms \setshell ________45_______6 ________73_______6 [ ________73_______7 .. ] Setel variabel \set k1 1 + permute(:r, :size, :default_seed + 123) \set k2 1 + permute(:r, :size, :default_seed + 321)6 ke hasil perintah shell 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26636 dengan 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26637(s) yang diberikan. Perintah harus mengembalikan nilai integer melalui keluaran standarnya 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26636 dan masing-masing 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26637 dapat berupa konstanta teks atau referensi \set size 1000000 \set r random_zipfian(1, 100 * :size, 1.07) \set k 1 + abs(hash(:r)) % :size3 \set size 1000000 \set r random_zipfian(1, 100 * :size, 1.07) \set k 1 + abs(hash(:r)) % :size4 ke variabel. Jika Anda ingin menggunakan 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 2663_7 yang dimulai dengan titik dua, tulis titik dua tambahan di awal 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26637 Contoh \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon \shell ________73_______6 [ ________73_______7 .. ] Sama seperti \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END_09, tetapi hasil dari perintah tersebut akan dibuang Contoh \shell command literal_argument :variable ::literal_starting_with_colon \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END_10 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END_11 Perintah-perintah ini membatasi awal dan akhir pipa pernyataan SQL. Dalam mode pipeline, pernyataan dikirimkan ke server tanpa menunggu hasil dari pernyataan sebelumnya. Lihat Bagian 34. 5 untuk lebih jelasnya. Mode pipeline memerlukan penggunaan protokol kueri yang diperluas Operator bawaanTabel 289. Operator pgbench Operator Keterangan Contoh \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END12 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END13 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END12 → ________0_______12 Logis ATAU \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END16 → \set k1 1 + permute(:r, :size, :default_seed + 123) \set k2 1 + permute(:r, :size, :default_seed + 321)9 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END12 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END19 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END12 → ________0_______12 Logis DAN \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END22 → \set size 1000000 \set r random_zipfian(1, 100 * :size, 1.07) \set k 1 + abs(hash(:r)) % :size0 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END24 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END12 → ________0_______12 TIDAK logis \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END27 → \set k1 1 + permute(:r, :size, :default_seed + 123) \set k2 1 + permute(:r, :size, :default_seed + 321)9 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END12 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END30 → ________0_______12 Tes nilai Boolean \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END32 → \set size 1000000 \set r random_zipfian(1, 100 * :size, 1.07) \set k 1 + abs(hash(:r)) % :size0 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END34 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END35 → ________0_______12 Tes nullness \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END37 → \set k1 1 + permute(:r, :size, :default_seed + 123) \set k2 1 + permute(:r, :size, :default_seed + 321)9 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END40 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 → ________0_______12 Setara \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END43 → \set size 1000000 \set r random_zipfian(1, 100 * :size, 1.07) \set k 1 + abs(hash(:r)) % :size0 ________73______2 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END46 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 → ________0_______12 Tidak sama \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END49 → \set k1 1 + permute(:r, :size, :default_seed + 123) \set k2 1 + permute(:r, :size, :default_seed + 321)9 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END52 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 → ________0_______12 Tidak sama \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END55 → \set size 1000000 \set r random_zipfian(1, 100 * :size, 1.07) \set k 1 + abs(hash(:r)) % :size0 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END58 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 → ________0_______12 Kurang dari \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END61 → \set size 1000000 \set r random_zipfian(1, 100 * :size, 1.07) \set k 1 + abs(hash(:r)) % :size0 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END64 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 → ________0_______12 Kurang dari atau sama dengan \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END67 → \set size 1000000 \set r random_zipfian(1, 100 * :size, 1.07) \set k 1 + abs(hash(:r)) % :size0 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END70 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 → ________0_______12 Lebih besar dari \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END73 → \set k1 1 + permute(:r, :size, :default_seed + 123) \set k2 1 + permute(:r, :size, :default_seed + 321)9 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END76 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 → ________0_______12 Lebih dari atau sama dengan \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END79 → \set k1 1 + permute(:r, :size, :default_seed + 123) \set k2 1 + permute(:r, :size, :default_seed + 321)9 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END82 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 → ________0_______81 Sedikit demi sedikit ATAU \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END85 → \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END86 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END88 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 → ________0_______81 XOR bitwise \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END_91 → \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END92 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END94 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 → ________0_______81 Sedikit demi sedikit DAN \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END_97 → \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END98 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END_99 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 → ________0_______81 Bitwise TIDAK \sleep 10 ms_02 → \sleep 10 ms03 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 \sleep 10 ms05 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 → ________0_______81 Pergeseran bitwise ke kiri \sleep 10 ms_08 → \sleep 10 ms09 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 \sleep 10 ms11 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 → ________0_______81 Pergeseran bitwise ke kanan \sleep 10 ms_14 → \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END92 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 \set aid random(1, 100000 * :scale) \set bid random(1, 1 * :scale) \set tid random(1, 10 * :scale) \set delta random(-5000, 5000) BEGIN; UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; SELECT abalance FROM pgbench_accounts WHERE aid = :aid; UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); END;1 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 → ________73_______2 Tambahan \sleep 10 ms_20 → \sleep 10 ms21 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 \set aid random(1, 100000 * :scale) \set bid random(1, 1 * :scale) \set tid random(1, 10 * :scale) \set delta random(-5000, 5000) BEGIN; UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; SELECT abalance FROM pgbench_accounts WHERE aid = :aid; UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); END;2 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 → ________73_______2 Pengurangan \sleep 10 ms_26 → \sleep 10 ms27 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 \set aid random(1, 100000 * :scale) \set bid random(1, 1 * :scale) \set tid random(1, 10 * :scale) \set delta random(-5000, 5000) BEGIN; UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; SELECT abalance FROM pgbench_accounts WHERE aid = :aid; UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); END;3 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 → ________73_______2 Perkalian \sleep 10 ms_32 → \sleep 10 ms33 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 \set aid random(1, 100000 * :scale) \set bid random(1, 1 * :scale) \set tid random(1, 10 * :scale) \set delta random(-5000, 5000) BEGIN; UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; SELECT abalance FROM pgbench_accounts WHERE aid = :aid; UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); END;4 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 → ________73_______2 Pembagian (memotong hasil ke nol jika kedua input adalah bilangan bulat) \sleep 10 ms_38 → \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END98 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 \sleep 10 ms41 \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 → ________0_______81 Modulo (sisa) \sleep 10 ms_44 → \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END98 \set aid random(1, 100000 * :scale) \set bid random(1, 1 * :scale) \set tid random(1, 10 * :scale) \set delta random(-5000, 5000) BEGIN; UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; SELECT abalance FROM pgbench_accounts WHERE aid = :aid; UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); END;2 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 → ________73_______2 Penyangkalan \sleep 10 ms_49 → \sleep 10 ms50 Fungsi BawaanTabel 290. Fungsi pgbench Fungsi Keterangan Contoh \sleep 10 ms_51 ( 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 ) → tipe yang sama dengan input Nilai mutlak \sleep 10 ms_53 → \sleep 10 ms54 \sleep 10 ms_55 ( 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 ) → tipe yang sama dengan input Mencetak argumen ke stderr, dan mengembalikan argumen \sleep 10 ms_57 → \sleep 10 ms58 \sleep 10 ms_59 ( 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 ) → \sleep 10 ms59 Cast untuk menggandakan \sleep 10 ms_62 → \sleep 10 ms63 \sleep 10 ms_64 ( 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 ) → \sleep 10 ms59 Eksponensial ( \sleep 10 ms67 dipangkatkan) \sleep 10 ms_68 → \sleep 10 ms69 \sleep 10 ms_70 ( 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 [, \sleep 10 ms72 ] ) → \sleep 10 ms59 jika ada argumen ganda, selain itu \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 Memilih nilai terbesar di antara argumen \sleep 10 ms_75 → \sleep 10 ms76 \sleep 10 ms_77 ( \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END34 [, \sleep 10 ms79 ] ) → \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 Ini adalah alias untuk ________4______81 \sleep 10 ms_82 → \sleep 10 ms83 \sleep 10 ms_84 ( \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END34 [, \sleep 10 ms79 ] ) → \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 Menghitung hash FNV-1a \sleep 10 ms_88 → \sleep 10 ms89 \sleep 10 ms_81 ( \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END34 [, \sleep 10 ms79 ] ) → \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 Menghitung hash MurmurHash2 \sleep 10 ms_94 → \sleep 10 ms83 \sleep 10 ms_96 ( 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 ) → \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 Mentransmisikan ke bilangan bulat \sleep 10 ms_99 → \sleep 10 ms21 \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_01 ( 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 [, \sleep 10 ms72 ] ) → \sleep 10 ms59 jika ada argumen ganda, selain itu \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 Memilih nilai terkecil di antara argumen \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_06 → \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon07 \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_08 ( 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 ) → \sleep 10 ms59 Logaritma alami \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_11 → \sleep 10 ms27 \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_13 ( \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81, \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 ) → \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 Modulo (sisa) \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_17 → \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon18 \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_19 ( \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon20, \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon21 [, \sleep 10 ms79 ] ) → \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 Nilai yang diizinkan \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_20, dalam rentang \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon25. Ini adalah posisi baru \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_20 (modulo \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon21) dalam permutasi pseudorandom bilangan bulat \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon28, diparameterisasi oleh \sleep 10 ms79, lihat di bawah \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_30 → \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon31 \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_32 () → \sleep 10 ms59 Perkiraan nilai π \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_34 → \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon35 \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_36 ( \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon37, \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon38 ) → \sleep 10 ms59 \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_40 ( \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon37, \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon38 ) → \sleep 10 ms59 \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_37 dipangkatkan menjadi \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon38 \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_46 → \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon47 \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_48 ( \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon49, \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon50 ) → \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 Menghitung bilangan bulat acak yang terdistribusi secara seragam di \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon52 \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_53 → \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon54 \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_55 ( \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon49, \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon50, \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon58 ) → \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 Menghitung bilangan bulat acak yang terdistribusi secara eksponensial di \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon52, lihat di bawah \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_61 → \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon54 \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_63 ( \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon49, \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon50, \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon58 ) → \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 Menghitung bilangan bulat acak terdistribusi Gaussian di \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon52, lihat di bawah \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_69 → \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon54 \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_71 ( \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon49, \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon50, \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon58 ) → \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END81 Menghitung bilangan bulat acak terdistribusi Zipfian di \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon52, lihat di bawah \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_77 → \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon54 \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_79 ( 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 26632 ) → \sleep 10 ms59 Akar pangkat dua \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_82 → \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon83 Fungsi \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_48 menghasilkan nilai menggunakan distribusi yang seragam, yaitu semua nilai diambil dalam rentang yang ditentukan dengan probabilitas yang sama. Fungsi \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_55, \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon63 dan \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon71 memerlukan parameter ganda tambahan yang menentukan bentuk distribusi yang tepat
CatatanSaat merancang tolok ukur yang memilih baris secara tidak seragam, perhatikan bahwa baris yang dipilih mungkin berkorelasi dengan data lain seperti ID dari urutan atau pengurutan baris fisik, yang dapat mendistorsi pengukuran kinerja Untuk menghindari hal ini, Anda mungkin ingin menggunakan fungsi \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon19, atau beberapa langkah tambahan lainnya dengan efek serupa, untuk mengocok baris yang dipilih dan menghapus korelasi tersebut Fungsi hash \sleep 10 ms_77, \sleep 10 ms81 dan \sleep 10 ms84 menerima nilai input dan parameter seed opsional. Jika benih tidak diberikan nilai \shell command literal_argument :variable ::literal_starting_with_colon40 digunakan, yang diinisialisasi secara acak kecuali diatur oleh opsi baris perintah \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon6 \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size) Dalam beberapa kasus diperlukan beberapa distribusi berbeda yang tidak berkorelasi satu sama lain dan ini adalah saat parameter seed opsional berguna \set k1 1 + permute(:r, :size, :default_seed + 123) \set k2 1 + permute(:r, :size, :default_seed + 321) Perilaku serupa juga dapat didekati dengan \sleep 10 ms77 \set size 1000000 \set r random_zipfian(1, 100 * :size, 1.07) \set k 1 + abs(hash(:r)) % :size Namun, karena \sleep 10 ms_77 menghasilkan tabrakan, beberapa nilai tidak akan dapat dijangkau dan nilai lainnya akan lebih sering dari yang diharapkan dari distribusi asli Sebagai contoh, definisi lengkap dari transaksi mirip TPC-B bawaan adalah \set aid random(1, 100000 * :scale) \set bid random(1, 1 * :scale) \set tid random(1, 10 * :scale) \set delta random(-5000, 5000) BEGIN; UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; SELECT abalance FROM pgbench_accounts WHERE aid = :aid; UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); END; Skrip ini memungkinkan setiap iterasi transaksi untuk mereferensikan baris berbeda yang dipilih secara acak. (Contoh ini juga menunjukkan mengapa penting bagi setiap sesi klien untuk memiliki variabelnya sendiri — jika tidak, mereka tidak akan menyentuh baris yang berbeda secara independen. ) Pencatatan Per-TransaksiSetiap baris dalam file log menjelaskan satu transaksi. Ini berisi bidang yang dipisahkan ruang berikut \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon_3 mengidentifikasi sesi klien yang menjalankan transaksi \shell command literal_argument :variable ::literal_starting_with_colon_45 menghitung berapa banyak transaksi yang telah dijalankan oleh sesi itu \shell command literal_argument :variable ::literal_starting_with_colon_46 waktu berlalu transaksi, dalam mikrodetik \shell command literal_argument :variable ::literal_starting_with_colon_47 mengidentifikasi file skrip yang digunakan untuk transaksi (berguna saat banyak skrip ditentukan dengan \shell command literal_argument :variable ::literal_starting_with_colon48 atau \shell command literal_argument :variable ::literal_starting_with_colon49) \shell command literal_argument :variable ::literal_starting_with_colon50 waktu penyelesaian transaksi, sebagai stempel waktu Unix-Epoch \shell command literal_argument :variable ::literal_starting_with_colon51 pecahan-detik bagian dari waktu penyelesaian transaksi, dalam mikrodetik \shell command literal_argument :variable ::literal_starting_with_colon52 penundaan mulai transaksi, yaitu perbedaan antara waktu mulai transaksi yang dijadwalkan dan waktu sebenarnya dimulai, dalam mikrodetik (hanya ada jika \shell command literal_argument :variable ::literal_starting_with_colon53 ditentukan) \shell command literal_argument :variable ::literal_starting_with_colon_54 jumlah percobaan ulang setelah kesalahan serialisasi atau deadlock selama transaksi (hanya ada jika \shell command literal_argument :variable ::literal_starting_with_colon55 tidak sama dengan satu) Ketika \shell command literal_argument :variable ::literal_starting_with_colon53 dan \shell command literal_argument :variable ::literal_starting_with_colon57 digunakan, \shell command literal_argument :variable ::literal_starting_with_colon46 untuk transaksi yang dilewati akan dilaporkan sebagai \shell command literal_argument :variable ::literal_starting_with_colon59. Jika transaksi berakhir dengan kegagalan, \shell command literal_argument :variable ::literal_starting_with_colon46 akan dilaporkan sebagai \shell command literal_argument :variable ::literal_starting_with_colon61. Jika Anda menggunakan opsi \shell command literal_argument :variable ::literal_starting_with_colon_62, \shell command literal_argument :variable ::literal_starting_with_colon46 dari transaksi yang gagal akan dilaporkan sebagai \shell command literal_argument :variable ::literal_starting_with_colon64 atau \shell command literal_argument :variable ::literal_starting_with_colon65 tergantung pada jenis kegagalan (lihat untuk informasi lebih lanjut) Berikut ini cuplikan file log yang dihasilkan dalam proses klien tunggal 0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 2663 Contoh lain dengan \shell command literal_argument :variable ::literal_starting_with_colon66 dan \shell command literal_argument :variable ::literal_starting_with_colon67 (perhatikan kolom tambahan \shell command literal_argument :variable ::literal_starting_with_colon52) \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END0 Dalam contoh ini, transaksi 82 terlambat, karena latensinya (6. 173 ms) melebihi batas 5 ms. Dua transaksi berikutnya dilewati, karena sudah terlambat bahkan sebelum dimulai Contoh berikut menampilkan cuplikan file log dengan kegagalan dan percobaan ulang, dengan jumlah maksimum percobaan diatur ke 10 (perhatikan kolom \shell command literal_argument :variable ::literal_starting_with_colon54 tambahan) \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END_1 Jika opsi \shell command literal_argument :variable ::literal_starting_with_colon_62 digunakan, jenis kegagalan dilaporkan dalam \shell command literal_argument :variable ::literal_starting_with_colon46 seperti ini \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END_2 Saat menjalankan pengujian panjang pada perangkat keras yang dapat menangani banyak transaksi, file log bisa menjadi sangat besar. Opsi \shell command literal_argument :variable ::literal_starting_with_colon_72 hanya dapat digunakan untuk mencatat sampel acak transaksi Pencatatan GabunganDengan opsi \shell command literal_argument :variable ::literal_starting_with_colon_73, format yang berbeda digunakan untuk file log. Setiap baris log menggambarkan satu interval agregasi. Ini berisi bidang yang dipisahkan ruang berikut \shell command literal_argument :variable ::literal_starting_with_colon74 waktu mulai interval, sebagai stempel waktu Unix-Epoch \shell command literal_argument :variable ::literal_starting_with_colon75 jumlah transaksi dalam interval \shell command literal_argument :variable ::literal_starting_with_colon76 jumlah latensi transaksi \shell command literal_argument :variable ::literal_starting_with_colon77 jumlah kuadrat latensi transaksi \shell command literal_argument :variable ::literal_starting_with_colon_78 latensi transaksi minimum \shell command literal_argument :variable ::literal_starting_with_colon79 latensi transaksi maksimum \shell command literal_argument :variable ::literal_starting_with_colon80 jumlah penundaan mulai transaksi (nol kecuali \shell command literal_argument :variable ::literal_starting_with_colon53 ditentukan) \shell command literal_argument :variable ::literal_starting_with_colon_82 jumlah kuadrat penundaan mulai transaksi (nol kecuali \shell command literal_argument :variable ::literal_starting_with_colon53 ditentukan) \shell command literal_argument :variable ::literal_starting_with_colon_84 penundaan mulai transaksi minimum (nol kecuali \shell command literal_argument :variable ::literal_starting_with_colon53 ditentukan) \shell command literal_argument :variable ::literal_starting_with_colon_86 penundaan mulai transaksi maksimum (nol kecuali \shell command literal_argument :variable ::literal_starting_with_colon53 ditentukan) \shell command literal_argument :variable ::literal_starting_with_colon59 jumlah transaksi yang dilewati karena akan terlambat dimulai (nol kecuali \shell command literal_argument :variable ::literal_starting_with_colon53 dan \shell command literal_argument :variable ::literal_starting_with_colon57 ditentukan) \shell command literal_argument :variable ::literal_starting_with_colon_91 jumlah transaksi yang dicoba ulang (nol kecuali \shell command literal_argument :variable ::literal_starting_with_colon55 tidak sama dengan satu) \shell command literal_argument :variable ::literal_starting_with_colon_54 jumlah percobaan ulang setelah kesalahan serialisasi atau kebuntuan (nol kecuali \shell command literal_argument :variable ::literal_starting_with_colon55 tidak sama dengan satu) \shell command literal_argument :variable ::literal_starting_with_colon_95 jumlah transaksi yang mendapat kesalahan serialisasi dan tidak dicoba lagi setelahnya (nol kecuali \shell command literal_argument :variable ::literal_starting_with_colon62 ditentukan) \shell command literal_argument :variable ::literal_starting_with_colon_97 jumlah transaksi yang mendapat kesalahan kebuntuan dan tidak dicoba lagi sesudahnya (nol kecuali \shell command literal_argument :variable ::literal_starting_with_colon62 ditentukan) Berikut adalah beberapa contoh keluaran yang dihasilkan dengan opsi ini \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END_3 Perhatikan bahwa meskipun format log biasa (tidak teragregasi) menunjukkan skrip mana yang digunakan untuk setiap transaksi, format teragregasi tidak. Oleh karena itu, jika Anda memerlukan data per skrip, Anda perlu mengumpulkan datanya sendiri Laporan Per-PernyataanLaporan menampilkan coba lagi statistik hanya jika opsi \shell command literal_argument :variable ::literal_starting_with_colon55 tidak sama dengan 1 Semua nilai dihitung untuk setiap pernyataan yang dieksekusi oleh setiap klien dan dilaporkan setelah tolok ukur selesai Untuk skrip default, hasilnya akan terlihat seperti ini \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END_4 Contoh lain dari output untuk skrip default menggunakan tingkat isolasi transaksi default serializable ( \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)00) \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END5 Jika beberapa file skrip ditentukan, semua statistik dilaporkan secara terpisah untuk setiap file skrip Perhatikan bahwa mengumpulkan informasi pengaturan waktu tambahan yang diperlukan untuk perhitungan latensi per pernyataan menambahkan beberapa overhead. Ini akan memperlambat kecepatan eksekusi rata-rata dan menurunkan TPS yang dihitung. Jumlah pelambatan sangat bervariasi tergantung pada platform dan perangkat keras. Membandingkan nilai TPS rata-rata dengan dan tanpa mengaktifkan pelaporan latensi adalah cara yang baik untuk mengukur apakah overhead waktu signifikan Kegagalan dan Serialisasi/Deadlock Retries
Jalankan klien dibatalkan jika terjadi kesalahan serius; . Selain itu, jika eksekusi perintah SQL atau meta gagal karena alasan selain kesalahan serialisasi atau kebuntuan, klien dibatalkan. Jika tidak, jika perintah SQL gagal dengan kesalahan serialisasi atau deadlock, klien tidak akan dibatalkan. Dalam kasus seperti itu, transaksi saat ini dibatalkan, yang juga mencakup pengaturan variabel klien seperti sebelum menjalankan transaksi ini (diasumsikan bahwa satu skrip transaksi hanya berisi satu transaksi; lihat informasi lebih lanjut). Transaksi dengan kesalahan serialisasi atau deadlock diulangi setelah rollback hingga selesai dengan sukses atau mencapai jumlah percobaan maksimum (ditentukan oleh opsi \shell command literal_argument :variable ::literal_starting_with_colon55) / waktu percobaan ulang maksimum (ditentukan oleh opsi \shell command literal_argument :variable ::literal_starting_with_colon57) / akhir tolok ukur (ditentukan oleh \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)_03 pilihan). Jika uji coba terakhir gagal, transaksi ini akan dilaporkan gagal tetapi klien tidak dibatalkan dan terus bekerja CatatanTanpa menentukan opsi \shell command literal_argument :variable ::literal_starting_with_colon_55, transaksi tidak akan pernah dicoba lagi setelah kesalahan serialisasi atau kebuntuan karena nilai standarnya adalah 1. Gunakan jumlah percobaan yang tidak terbatas ( \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)05) dan opsi \shell command literal_argument :variable ::literal_starting_with_colon57 untuk membatasi hanya waktu maksimum percobaan. Anda juga dapat menggunakan opsi \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)_03 untuk membatasi durasi benchmark dengan jumlah percobaan yang tidak terbatas Berhati-hatilah saat mengulang skrip yang berisi banyak transaksi. skrip selalu dicoba ulang sepenuhnya, sehingga transaksi yang berhasil dapat dilakukan beberapa kali Hati-hati saat mengulang transaksi dengan perintah shell. Berbeda dengan hasil perintah SQL, hasil perintah shell tidak digulung kembali, kecuali untuk nilai variabel dari perintah \set ntellers 10 * :scale \set aid (1021 * random(1, 100000 * :scale)) % \ (100000 * :scale) + 1 \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END09 Latensi transaksi yang berhasil mencakup keseluruhan waktu eksekusi transaksi dengan pengembalian dan percobaan ulang. Latensi diukur hanya untuk transaksi dan perintah yang berhasil tetapi tidak untuk transaksi atau perintah yang gagal Laporan utama berisi jumlah transaksi yang gagal. Jika opsi \shell command literal_argument :variable ::literal_starting_with_colon_55 tidak sama dengan 1, laporan utama juga berisi statistik yang terkait dengan percobaan ulang. jumlah total transaksi yang dicoba ulang dan jumlah total percobaan ulang. Laporan per skrip mewarisi semua bidang ini dari laporan utama. Laporan per pernyataan menampilkan statistik coba lagi hanya jika opsi \shell command literal_argument :variable ::literal_starting_with_colon55 tidak sama dengan 1 Jika Anda ingin mengelompokkan kegagalan menurut jenis dasar dalam log per transaksi dan agregasi, serta dalam laporan utama dan per skrip, gunakan opsi \shell command literal_argument :variable ::literal_starting_with_colon62. Jika Anda juga ingin membedakan semua kesalahan dan kegagalan (kesalahan tanpa mencoba ulang) menurut jenis termasuk batas percobaan ulang mana yang terlampaui dan berapa banyak yang terlampaui untuk kegagalan serialisasi/kebuntuan, gunakan opsi \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)12 Latihan yang baikPertama-tama, jangan pernah percaya tes apa pun yang berjalan hanya beberapa detik. Gunakan opsi \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)13 atau \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)14 untuk membuat lari berlangsung setidaknya beberapa menit, untuk meratakan kebisingan. Dalam beberapa kasus, Anda mungkin memerlukan waktu berjam-jam untuk mendapatkan angka yang dapat direproduksi. Sebaiknya coba uji coba beberapa kali, untuk mengetahui apakah nomor Anda dapat direproduksi atau tidak Untuk skenario pengujian seperti TPC-B default, faktor skala inisialisasi ( \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)15) setidaknya harus sebesar jumlah terbesar klien yang ingin Anda uji ( \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)16); . Hanya ada \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)15 baris di tabel \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)18, dan setiap transaksi ingin memperbarui salah satunya, jadi \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)16 nilai lebih dari \set size 1000000 \set r random_zipfian(1, :size, 1.07) \set k 1 + permute(:r, :size)15 niscaya akan mengakibatkan banyak transaksi diblokir menunggu transaksi lainnya Skenario pengujian default juga cukup sensitif terhadap berapa lama sejak tabel diinisialisasi. akumulasi baris mati dan ruang mati dalam tabel mengubah hasil. Untuk memahami hasil, Anda harus melacak jumlah total pembaruan dan saat penyedot debu terjadi. Jika autovacuum diaktifkan, ini dapat mengakibatkan perubahan tak terduga dalam kinerja terukur Bahasa apa yang digunakan PostgreSQL?PostgreSQL adalah sistem manajemen basis data relasional atau RDBMS yang bersifat open source. Sistem manajemen basis data ini menggunakan bahasa kueri utama SQL , sama seperti MySQL.
Kapan menggunakan PostgreSQL?PostgreSQL merupakan database yang cocok digunakan pada sistem berskala besar, karena dapat menangani banyak transaksi data sekaligus . Misalnya pada aplikasi berbasis GIS (Geographical Information System). Aplikasi GIS menyimpan dan mengolah banyak data spasial, atau pemetaan lokasi.
Apakah PostgreSQL gratis?PostgreSQL adalah salah satu jenis database relasional atau biasa disebut Relation Database Management System (RDBMS) yang bersifat open source seperti halnya MySQL. Selain itu, PostgreSQL dapat mengolah data dalam tabel yang memiliki hubungan satu sama lain dan dapat digunakan gratis .
Jelaskan apa yang Anda ketahui tentang PostgreSQL?PostgreSQL adalah sistem manajemen basis data relasional yang Anda dapat menggunakan dan mengembangkannya dalam sumber terbuka dan gratis. Software ini dapat berjalan di sistem operasi berbasis Linux seperti Debian, Ubuntu, Fedora, dan lainnya. |