diff --git a/.github/workflows/postgresql-16-src-meson-perf.yml b/.github/workflows/postgresql-17-src-meson-perf.yml similarity index 94% rename from .github/workflows/postgresql-16-src-meson-perf.yml rename to .github/workflows/postgresql-17-src-meson-perf.yml index 56f9949a..c155aca5 100644 --- a/.github/workflows/postgresql-16-src-meson-perf.yml +++ b/.github/workflows/postgresql-17-src-meson-perf.yml @@ -37,12 +37,11 @@ jobs: echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list sudo apt update && sudo apt install -y vault - - name: Clone postgres repository uses: actions/checkout@v4 with: - repository: 'postgres/postgres' - ref: 'a81e5516fa4bc53e332cb35eefe231147c0e1749' + repository: 'percona-lab/postgres' + ref: 'TDE_REL_17_STABLE' path: 'src' - name: Clone pg_tde repository @@ -50,10 +49,6 @@ jobs: with: path: 'src/contrib/pg_tde' - - name: Include pg_tde in meson build - run: | - echo "subdir('pg_tde')" >> src/contrib/meson.build - - name: Build postgres run: | meson setup build --prefix `pwd`/../inst --buildtype=release @@ -93,6 +88,7 @@ jobs: bin/psql sbtest2 <<< "SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per');" bin/psql sbtest2 <<< "SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault');" cp -r ../src/contrib/pg_tde/sysbench . + cp -r ../src/contrib/pg_tde/perf . working-directory: inst - name: Run baseline performance tests @@ -109,6 +105,12 @@ jobs: sysbench --db-driver=pgsql --threads=1 sysbench/oltp_read_only.lua --tables=1 --table-size=10000 --pgsql-db=sbtest2 run | tee perf_tde working-directory: inst + - name: Run seq read performance tests + run: | + export PATH=../bin/:$PATH + ./seq_read.sh | tee seq_read + working-directory: inst/perf + - name: Print results run: | NORM_Q=$(cat perf_norm | grep 'total number of events' | cut -d ':' -f 2 | sed 's/ //g') @@ -119,6 +121,7 @@ jobs: echo "Normal queries: $(cat perf_norm | grep 'total number of events' | cut -d ':' -f 2 | sed 's/ //g')" >> pr_perf_results echo "TDE queries: $(cat perf_tde | grep 'total number of events' | cut -d ':' -f 2 | sed 's/ //g')" >> pr_perf_results echo "Percentage: $(($TDE_Q*100/$NORM_Q))%" >> pr_perf_results + cat perf/seq_read >> pr_perf_results PERF_RESULT=$(cat pr_perf_results) echo "PERF_RESULT<> $GITHUB_ENV echo "$PERF_RESULT" >> $GITHUB_ENV diff --git a/perf/pp-2019.csv.xz b/perf/pp-2019.csv.xz new file mode 100644 index 00000000..224b589a Binary files /dev/null and b/perf/pp-2019.csv.xz differ diff --git a/perf/seq_read.sh b/perf/seq_read.sh new file mode 100755 index 00000000..70819f91 --- /dev/null +++ b/perf/seq_read.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +cd "$(dirname "$0")" + +xz -d pp-2019.csv.xz +cp pp-2019.csv /tmp/ +createdb seq_read_test +psql seq_read_test < seq_read_prepare.sql > /dev/null +echo "Sequential scan read times" +echo "==========================" +echo -n "HEAP: " +psql seq_read_test < seq_read_run_heap.sql | grep "Execution" | tail -n 10 | cut -d " " -f 4 | paste -sd+ | bc +echo -n "TDE: " +psql seq_read_test < seq_read_run_tde.sql | grep "Execution" | tail -n 10 | cut -d " " -f 4 | paste -sd+ | bc +echo -n "TDE_BASIC: " +psql seq_read_test < seq_read_run_tde_basic.sql | grep "Execution" | tail -n 10 | cut -d " " -f 4 | paste -sd+ | bc diff --git a/perf/seq_read_prepare.sql b/perf/seq_read_prepare.sql new file mode 100644 index 00000000..c9df732c --- /dev/null +++ b/perf/seq_read_prepare.sql @@ -0,0 +1,65 @@ +CREATE EXTENSION pg_tde; + +SELECT pg_tde_add_key_provider_file('file-store','/tmp/pg_tde_test_keyring.per'); +SELECT pg_tde_set_principal_key('test-db-principal-key','file-store'); + + +CREATE TABLE land_registry_price_paid_uk( + transaction uuid, + price numeric, + transfer_date date, + postcode text, + property_type char(1), + newly_built boolean, + duration char(1), + paon text, + saon text, + street text, + locality text, + city text, + district text, + county text, + ppd_category_type char(1), + record_status char(1)); + +CREATE TABLE land_registry_price_paid_uk_tde( + transaction uuid, + price numeric, + transfer_date date, + postcode text, + property_type char(1), + newly_built boolean, + duration char(1), + paon text, + saon text, + street text, + locality text, + city text, + district text, + county text, + ppd_category_type char(1), + record_status char(1)) USING tde_heap; + +CREATE TABLE land_registry_price_paid_uk_tde_basic( + transaction uuid, + price numeric, + transfer_date date, + postcode text, + property_type char(1), + newly_built boolean, + duration char(1), + paon text, + saon text, + street text, + locality text, + city text, + district text, + county text, + ppd_category_type char(1), + record_status char(1)) USING tde_heap_basic; + +COPY land_registry_price_paid_uk FROM '/tmp/pp-2019.csv' with (format csv, encoding 'win1252', header false, null '', quote '"', force_null (postcode, saon, paon, street, locality, city, district)); + +COPY land_registry_price_paid_uk_tde FROM '/tmp/pp-2019.csv' with (format csv, encoding 'win1252', header false, null '', quote '"', force_null (postcode, saon, paon, street, locality, city, district)); + +COPY land_registry_price_paid_uk_tde_basic FROM '/tmp/pp-2019.csv' with (format csv, encoding 'win1252', header false, null '', quote '"', force_null (postcode, saon, paon, street, locality, city, district)); diff --git a/perf/seq_read_run_heap.sql b/perf/seq_read_run_heap.sql new file mode 100644 index 00000000..1ad94e73 --- /dev/null +++ b/perf/seq_read_run_heap.sql @@ -0,0 +1,11 @@ +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk; diff --git a/perf/seq_read_run_tde.sql b/perf/seq_read_run_tde.sql new file mode 100644 index 00000000..13c86b18 --- /dev/null +++ b/perf/seq_read_run_tde.sql @@ -0,0 +1,11 @@ +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk_tde; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk_tde; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk_tde; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk_tde; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk_tde; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk_tde; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk_tde; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk_tde; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk_tde; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk_tde; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk_tde; diff --git a/perf/seq_read_run_tde_basic.sql b/perf/seq_read_run_tde_basic.sql new file mode 100644 index 00000000..4a90b41a --- /dev/null +++ b/perf/seq_read_run_tde_basic.sql @@ -0,0 +1,11 @@ +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk_tde_basic; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk_tde_basic; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk_tde_basic; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk_tde_basic; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk_tde_basic; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk_tde_basic; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk_tde_basic; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk_tde_basic; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk_tde_basic; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk_tde_basic; +EXPLAIN ANALYZE SELECT * FROM land_registry_price_paid_uk_tde_basic;