Add benchmark for integer only data (#28)
Closes GH-23
The current implementation isn't optimal yet but this simple benchmark
result shows that Apache Arrow Flight SQL is faster for large data.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0799936..665651e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -81,6 +81,30 @@
ANY)
target_link_directories(postgresql INTERFACE ${AFS_PG_LIB_DIR})
+add_library(libpq SHARED IMPORTED)
+execute_process(
+ COMMAND pg_config "--includedir"
+ OUTPUT_VARIABLE AFS_LIBPG_INCLUDE_DIR
+ OUTPUT_STRIP_TRAILING_WHITESPACE ECHO_OUTPUT_VARIABLE COMMAND_ERROR_IS_FATAL
+ ANY)
+target_include_directories(libpq INTERFACE ${AFS_LIBPG_INCLUDE_DIR})
+execute_process(
+ COMMAND pg_config "--cflags"
+ OUTPUT_VARIABLE AFS_LIBPQ_CFLAGS
+ OUTPUT_STRIP_TRAILING_WHITESPACE ECHO_OUTPUT_VARIABLE COMMAND_ERROR_IS_FATAL
+ ANY)
+separate_arguments(AFS_LIBPQ_COMPILE_OPTIONS NATIVE_COMMAND PROGRAM
+ SEPARATE_ARGS ${AFS_LIBPQ_CFLAGS})
+target_compile_options(libpq INTERFACE ${AFS_LIBPQ_COMPILE_OPTIONS})
+execute_process(
+ COMMAND pg_config "--libdir"
+ OUTPUT_VARIABLE AFS_LIBPQ_LIB_DIR
+ OUTPUT_STRIP_TRAILING_WHITESPACE ECHO_OUTPUT_VARIABLE COMMAND_ERROR_IS_FATAL
+ ANY)
+find_library(AFS_LIBPQ_SHARED_LIBRARY pq PATHS ${AFS_LIBPQ_LIB_DIR})
+set_target_properties(libpq PROPERTIES IMPORTED_LOCATION
+ ${AFS_LIBPQ_SHARED_LIBRARY})
+
find_package(ArrowFlightSql REQUIRED)
add_library(arrow_flight_sql MODULE ${AFS_SOURCES})
@@ -97,3 +121,5 @@
install(TARGETS arrow_flight_sql DESTINATION "${AFS_PG_EXTENSION_DIR}")
install(FILES LICENSE.txt NOTICE.txt DESTINATION "${CMAKE_INSTALL_DOCDIR}")
+
+add_subdirectory(benchmark/integer)
diff --git a/benchmark/integer/CMakeLists.txt b/benchmark/integer/CMakeLists.txt
new file mode 100644
index 0000000..8b1c29d
--- /dev/null
+++ b/benchmark/integer/CMakeLists.txt
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+add_executable(select select.c)
+target_link_libraries(select libpq)
diff --git a/benchmark/integer/README.md b/benchmark/integer/README.md
new file mode 100644
index 0000000..eb7ee77
--- /dev/null
+++ b/benchmark/integer/README.md
@@ -0,0 +1,83 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+
+# Benchmark - only with integer data
+
+## How to run
+
+Install Apache Arrow Flight SQL PostgreSQL adapter.
+
+Run PostgreSQL with the following configuration:
+
+```text
+shared_preload_libraries = 'arrow_flight_sql'
+```
+
+Prepare database:
+
+```bash
+psql postgres -c '\i benchmark/integer/prepare1.sql'
+```
+
+It creates `afs_benchmark` database and `data` table in the database.
+It also inserts 10M records with random integers to the table.
+
+Run the following programs:
+
+* `select.rb`: It uses Apache Arrow Flight SQL
+* `select`: It uses PostgreSQL's C API
+* `select.sql`: You need to use `psql` to run this
+
+All of them just run `SELECT * FROM data`.
+
+## Result
+
+Here is a benchmark result on the following environment:
+
+* OS: Debian GNU/Linux sid
+* CPU: AMD Ryzen 9 3900X 12-Core Processor
+* Memory: 64GiB
+* PostgreSQL: 16 (not released yet)
+ 019f8624664dbf1e25e2bd721c7e99822812d109
+* Apache Arrow: 12.0.0-SNAPSHOT
+ 237705bf17486cfc35ab7d1ddfe59dd60f042ab8
+* Apache Arrow Flight SQL PostgreSQL adapter:
+ 0.1.0 (not released yet)
+ 120e7bbd3fd580c892c988499d488c7e8b34efe2
+
+
+
+100K records:
+
+| Apache Arrow Flight SQL | C | psql |
+| ----------------------- | ----- | ----- |
+| 0.014 | 0.012 | 0.011 |
+
+1M records:
+
+| Apache Arrow Flight SQL | C | psql |
+| ----------------------- | ----- | ----- |
+| 0.069 | 0.116 | 0.107 |
+
+10M records:
+
+| Apache Arrow Flight SQL | C | psql |
+| ----------------------- | ----- | ----- |
+| 0.653 | 1.154 | 1.128 |
+
diff --git a/benchmark/integer/graph.rb b/benchmark/integer/graph.rb
new file mode 100755
index 0000000..47072b0
--- /dev/null
+++ b/benchmark/integer/graph.rb
@@ -0,0 +1,31 @@
+#!/usr/bin/env ruby
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+require "csv"
+require "charty"
+
+Charty::Backends.use("pyplot")
+data = CSV.read(File.join(__dir__, "result.csv"),
+ headers: true,
+ converters: :all)
+plotter = Charty.bar_plot(data: data,
+ x: "N records",
+ y: "Elapsed time (sec)",
+ color: "Approach")
+plotter.save("result.svg")
diff --git a/benchmark/integer/prepare-100K.sql b/benchmark/integer/prepare-100K.sql
new file mode 100644
index 0000000..9c7812c
--- /dev/null
+++ b/benchmark/integer/prepare-100K.sql
@@ -0,0 +1,26 @@
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements. See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership. The ASF licenses this file
+-- to you under the Apache License, Version 2.0 (the
+-- "License"); you may not use this file except in compliance
+-- with the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing,
+-- software distributed under the License is distributed on an
+-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+-- KIND, either express or implied. See the License for the
+-- specific language governing permissions and limitations
+-- under the License.
+
+DROP DATABASE IF EXISTS afs_benchmark;
+CREATE DATABASE afs_benchmark;
+\c afs_benchmark
+
+DROP TABLE IF EXISTS data;
+CREATE TABLE data (int32 integer);
+INSERT INTO data
+ SELECT random() * 10000
+ FROM generate_series(1, 100000);
diff --git a/benchmark/integer/prepare-10M.sql b/benchmark/integer/prepare-10M.sql
new file mode 100644
index 0000000..456c74f
--- /dev/null
+++ b/benchmark/integer/prepare-10M.sql
@@ -0,0 +1,26 @@
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements. See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership. The ASF licenses this file
+-- to you under the Apache License, Version 2.0 (the
+-- "License"); you may not use this file except in compliance
+-- with the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing,
+-- software distributed under the License is distributed on an
+-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+-- KIND, either express or implied. See the License for the
+-- specific language governing permissions and limitations
+-- under the License.
+
+DROP DATABASE IF EXISTS afs_benchmark;
+CREATE DATABASE afs_benchmark;
+\c afs_benchmark
+
+DROP TABLE IF EXISTS data;
+CREATE TABLE data (int32 integer);
+INSERT INTO data
+ SELECT random() * 10000
+ FROM generate_series(1, 10000000);
diff --git a/benchmark/integer/prepare-1M.sql b/benchmark/integer/prepare-1M.sql
new file mode 100644
index 0000000..33d9ef8
--- /dev/null
+++ b/benchmark/integer/prepare-1M.sql
@@ -0,0 +1,26 @@
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements. See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership. The ASF licenses this file
+-- to you under the Apache License, Version 2.0 (the
+-- "License"); you may not use this file except in compliance
+-- with the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing,
+-- software distributed under the License is distributed on an
+-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+-- KIND, either express or implied. See the License for the
+-- specific language governing permissions and limitations
+-- under the License.
+
+DROP DATABASE IF EXISTS afs_benchmark;
+CREATE DATABASE afs_benchmark;
+\c afs_benchmark
+
+DROP TABLE IF EXISTS data;
+CREATE TABLE data (int32 integer);
+INSERT INTO data
+ SELECT random() * 10000
+ FROM generate_series(1, 1000000);
diff --git a/benchmark/integer/result.csv b/benchmark/integer/result.csv
new file mode 100644
index 0000000..26be7eb
--- /dev/null
+++ b/benchmark/integer/result.csv
@@ -0,0 +1,10 @@
+Approach,N records,Elapsed time (sec)
+Apache Arrow Flight SQL,100000,0.014
+C,100000,0.012
+psql,100000,0.011
+Apache Arrow Flight SQL,1000000,0.069
+C,1000000,0.116
+psql,1000000,0.107
+Apache Arrow Flight SQL,10000000,0.653
+C,10000000,1.154
+psql,10000000,1.128
diff --git a/benchmark/integer/result.svg b/benchmark/integer/result.svg
new file mode 100644
index 0000000..64c0bec
--- /dev/null
+++ b/benchmark/integer/result.svg
@@ -0,0 +1,1189 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="460.8pt" height="345.6pt" viewBox="0 0 460.8 345.6" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <metadata>
+ <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <cc:Work>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:date>2023-03-09T12:54:01.164041</dc:date>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Matplotlib v3.6.3, https://matplotlib.org/</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs>
+ <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
+ </defs>
+ <g id="figure_1">
+ <g id="patch_1">
+ <path d="M 0 345.6
+L 460.8 345.6
+L 460.8 0
+L 0 0
+z
+" style="fill: #ffffff"/>
+ </g>
+ <g id="axes_1">
+ <g id="patch_2">
+ <path d="M 57.6 307.584
+L 414.72 307.584
+L 414.72 41.472
+L 57.6 41.472
+z
+" style="fill: #ffffff"/>
+ </g>
+ <g id="patch_3">
+ <path d="M 69.82144 307.584
+L 100.93056 307.584
+L 100.93056 304.509338
+L 69.82144 304.509338
+z
+" clip-path="url(#p3572019ee8)" style="fill: #1f77b4"/>
+ </g>
+ <g id="patch_4">
+ <path d="M 188.86144 307.584
+L 219.97056 307.584
+L 219.97056 292.430308
+L 188.86144 292.430308
+z
+" clip-path="url(#p3572019ee8)" style="fill: #1f77b4"/>
+ </g>
+ <g id="patch_5">
+ <path d="M 307.90144 307.584
+L 339.01056 307.584
+L 339.01056 164.172977
+L 307.90144 164.172977
+z
+" clip-path="url(#p3572019ee8)" style="fill: #1f77b4"/>
+ </g>
+ <g id="patch_6">
+ <path d="M 101.56544 307.584
+L 132.67456 307.584
+L 132.67456 304.948575
+L 101.56544 304.948575
+z
+" clip-path="url(#p3572019ee8)" style="fill: #ff7f0e"/>
+ </g>
+ <g id="patch_7">
+ <path d="M 220.60544 307.584
+L 251.71456 307.584
+L 251.71456 282.108229
+L 220.60544 282.108229
+z
+" clip-path="url(#p3572019ee8)" style="fill: #ff7f0e"/>
+ </g>
+ <g id="patch_8">
+ <path d="M 339.64544 307.584
+L 370.75456 307.584
+L 370.75456 54.144
+L 339.64544 54.144
+z
+" clip-path="url(#p3572019ee8)" style="fill: #ff7f0e"/>
+ </g>
+ <g id="patch_9">
+ <path d="M 133.30944 307.584
+L 164.41856 307.584
+L 164.41856 305.168194
+L 133.30944 305.168194
+z
+" clip-path="url(#p3572019ee8)" style="fill: #2ca02c"/>
+ </g>
+ <g id="patch_10">
+ <path d="M 252.34944 307.584
+L 283.45856 307.584
+L 283.45856 284.084797
+L 252.34944 284.084797
+z
+" clip-path="url(#p3572019ee8)" style="fill: #2ca02c"/>
+ </g>
+ <g id="patch_11">
+ <path d="M 371.38944 307.584
+L 402.49856 307.584
+L 402.49856 59.854087
+L 371.38944 59.854087
+z
+" clip-path="url(#p3572019ee8)" style="fill: #2ca02c"/>
+ </g>
+ <g id="matplotlib.axis_1">
+ <g id="xtick_1">
+ <g id="line2d_1">
+ <defs>
+ <path id="m42c665c27f" d="M 0 0
+L 0 3.5
+" style="stroke: #000000; stroke-width: 0.8"/>
+ </defs>
+ <g>
+ <use xlink:href="#m42c665c27f" x="117.12" y="307.584" style="stroke: #000000; stroke-width: 0.8"/>
+ </g>
+ </g>
+ <g id="text_1">
+ <!-- 100000 -->
+ <g transform="translate(98.0325 322.182437) scale(0.1 -0.1)">
+ <defs>
+ <path id="DejaVuSans-31" d="M 794 531
+L 1825 531
+L 1825 4091
+L 703 3866
+L 703 4441
+L 1819 4666
+L 2450 4666
+L 2450 531
+L 3481 531
+L 3481 0
+L 794 0
+L 794 531
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-30" d="M 2034 4250
+Q 1547 4250 1301 3770
+Q 1056 3291 1056 2328
+Q 1056 1369 1301 889
+Q 1547 409 2034 409
+Q 2525 409 2770 889
+Q 3016 1369 3016 2328
+Q 3016 3291 2770 3770
+Q 2525 4250 2034 4250
+z
+M 2034 4750
+Q 2819 4750 3233 4129
+Q 3647 3509 3647 2328
+Q 3647 1150 3233 529
+Q 2819 -91 2034 -91
+Q 1250 -91 836 529
+Q 422 1150 422 2328
+Q 422 3509 836 4129
+Q 1250 4750 2034 4750
+z
+" transform="scale(0.015625)"/>
+ </defs>
+ <use xlink:href="#DejaVuSans-31"/>
+ <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+ <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+ <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+ <use xlink:href="#DejaVuSans-30" x="254.492188"/>
+ <use xlink:href="#DejaVuSans-30" x="318.115234"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_2">
+ <g id="line2d_2">
+ <g>
+ <use xlink:href="#m42c665c27f" x="236.16" y="307.584" style="stroke: #000000; stroke-width: 0.8"/>
+ </g>
+ </g>
+ <g id="text_2">
+ <!-- 1000000 -->
+ <g transform="translate(213.89125 322.182437) scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-31"/>
+ <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+ <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+ <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+ <use xlink:href="#DejaVuSans-30" x="254.492188"/>
+ <use xlink:href="#DejaVuSans-30" x="318.115234"/>
+ <use xlink:href="#DejaVuSans-30" x="381.738281"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_3">
+ <g id="line2d_3">
+ <g>
+ <use xlink:href="#m42c665c27f" x="355.2" y="307.584" style="stroke: #000000; stroke-width: 0.8"/>
+ </g>
+ </g>
+ <g id="text_3">
+ <!-- 10000000 -->
+ <g transform="translate(329.75 322.182437) scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-31"/>
+ <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+ <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+ <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+ <use xlink:href="#DejaVuSans-30" x="254.492188"/>
+ <use xlink:href="#DejaVuSans-30" x="318.115234"/>
+ <use xlink:href="#DejaVuSans-30" x="381.738281"/>
+ <use xlink:href="#DejaVuSans-30" x="445.361328"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_4">
+ <!-- N records -->
+ <g transform="translate(212.255313 335.860562) scale(0.1 -0.1)">
+ <defs>
+ <path id="DejaVuSans-4e" d="M 628 4666
+L 1478 4666
+L 3547 763
+L 3547 4666
+L 4159 4666
+L 4159 0
+L 3309 0
+L 1241 3903
+L 1241 0
+L 628 0
+L 628 4666
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-20" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-72" d="M 2631 2963
+Q 2534 3019 2420 3045
+Q 2306 3072 2169 3072
+Q 1681 3072 1420 2755
+Q 1159 2438 1159 1844
+L 1159 0
+L 581 0
+L 581 3500
+L 1159 3500
+L 1159 2956
+Q 1341 3275 1631 3429
+Q 1922 3584 2338 3584
+Q 2397 3584 2469 3576
+Q 2541 3569 2628 3553
+L 2631 2963
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-65" d="M 3597 1894
+L 3597 1613
+L 953 1613
+Q 991 1019 1311 708
+Q 1631 397 2203 397
+Q 2534 397 2845 478
+Q 3156 559 3463 722
+L 3463 178
+Q 3153 47 2828 -22
+Q 2503 -91 2169 -91
+Q 1331 -91 842 396
+Q 353 884 353 1716
+Q 353 2575 817 3079
+Q 1281 3584 2069 3584
+Q 2775 3584 3186 3129
+Q 3597 2675 3597 1894
+z
+M 3022 2063
+Q 3016 2534 2758 2815
+Q 2500 3097 2075 3097
+Q 1594 3097 1305 2825
+Q 1016 2553 972 2059
+L 3022 2063
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-63" d="M 3122 3366
+L 3122 2828
+Q 2878 2963 2633 3030
+Q 2388 3097 2138 3097
+Q 1578 3097 1268 2742
+Q 959 2388 959 1747
+Q 959 1106 1268 751
+Q 1578 397 2138 397
+Q 2388 397 2633 464
+Q 2878 531 3122 666
+L 3122 134
+Q 2881 22 2623 -34
+Q 2366 -91 2075 -91
+Q 1284 -91 818 406
+Q 353 903 353 1747
+Q 353 2603 823 3093
+Q 1294 3584 2113 3584
+Q 2378 3584 2631 3529
+Q 2884 3475 3122 3366
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-6f" d="M 1959 3097
+Q 1497 3097 1228 2736
+Q 959 2375 959 1747
+Q 959 1119 1226 758
+Q 1494 397 1959 397
+Q 2419 397 2687 759
+Q 2956 1122 2956 1747
+Q 2956 2369 2687 2733
+Q 2419 3097 1959 3097
+z
+M 1959 3584
+Q 2709 3584 3137 3096
+Q 3566 2609 3566 1747
+Q 3566 888 3137 398
+Q 2709 -91 1959 -91
+Q 1206 -91 779 398
+Q 353 888 353 1747
+Q 353 2609 779 3096
+Q 1206 3584 1959 3584
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-64" d="M 2906 2969
+L 2906 4863
+L 3481 4863
+L 3481 0
+L 2906 0
+L 2906 525
+Q 2725 213 2448 61
+Q 2172 -91 1784 -91
+Q 1150 -91 751 415
+Q 353 922 353 1747
+Q 353 2572 751 3078
+Q 1150 3584 1784 3584
+Q 2172 3584 2448 3432
+Q 2725 3281 2906 2969
+z
+M 947 1747
+Q 947 1113 1208 752
+Q 1469 391 1925 391
+Q 2381 391 2643 752
+Q 2906 1113 2906 1747
+Q 2906 2381 2643 2742
+Q 2381 3103 1925 3103
+Q 1469 3103 1208 2742
+Q 947 2381 947 1747
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-73" d="M 2834 3397
+L 2834 2853
+Q 2591 2978 2328 3040
+Q 2066 3103 1784 3103
+Q 1356 3103 1142 2972
+Q 928 2841 928 2578
+Q 928 2378 1081 2264
+Q 1234 2150 1697 2047
+L 1894 2003
+Q 2506 1872 2764 1633
+Q 3022 1394 3022 966
+Q 3022 478 2636 193
+Q 2250 -91 1575 -91
+Q 1294 -91 989 -36
+Q 684 19 347 128
+L 347 722
+Q 666 556 975 473
+Q 1284 391 1588 391
+Q 1994 391 2212 530
+Q 2431 669 2431 922
+Q 2431 1156 2273 1281
+Q 2116 1406 1581 1522
+L 1381 1569
+Q 847 1681 609 1914
+Q 372 2147 372 2553
+Q 372 3047 722 3315
+Q 1072 3584 1716 3584
+Q 2034 3584 2315 3537
+Q 2597 3491 2834 3397
+z
+" transform="scale(0.015625)"/>
+ </defs>
+ <use xlink:href="#DejaVuSans-4e"/>
+ <use xlink:href="#DejaVuSans-20" x="74.804688"/>
+ <use xlink:href="#DejaVuSans-72" x="106.591797"/>
+ <use xlink:href="#DejaVuSans-65" x="145.455078"/>
+ <use xlink:href="#DejaVuSans-63" x="206.978516"/>
+ <use xlink:href="#DejaVuSans-6f" x="261.958984"/>
+ <use xlink:href="#DejaVuSans-72" x="323.140625"/>
+ <use xlink:href="#DejaVuSans-64" x="362.503906"/>
+ <use xlink:href="#DejaVuSans-73" x="425.980469"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_2">
+ <g id="ytick_1">
+ <g id="line2d_4">
+ <defs>
+ <path id="meee343289d" d="M 0 0
+L -3.5 0
+" style="stroke: #000000; stroke-width: 0.8"/>
+ </defs>
+ <g>
+ <use xlink:href="#meee343289d" x="57.6" y="307.584" style="stroke: #000000; stroke-width: 0.8"/>
+ </g>
+ </g>
+ <g id="text_5">
+ <!-- 0.0 -->
+ <g transform="translate(34.696875 311.383219) scale(0.1 -0.1)">
+ <defs>
+ <path id="DejaVuSans-2e" d="M 684 794
+L 1344 794
+L 1344 0
+L 684 0
+L 684 794
+z
+" transform="scale(0.015625)"/>
+ </defs>
+ <use xlink:href="#DejaVuSans-30"/>
+ <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+ <use xlink:href="#DejaVuSans-30" x="95.410156"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_2">
+ <g id="line2d_5">
+ <g>
+ <use xlink:href="#meee343289d" x="57.6" y="263.660256" style="stroke: #000000; stroke-width: 0.8"/>
+ </g>
+ </g>
+ <g id="text_6">
+ <!-- 0.2 -->
+ <g transform="translate(34.696875 267.459475) scale(0.1 -0.1)">
+ <defs>
+ <path id="DejaVuSans-32" d="M 1228 531
+L 3431 531
+L 3431 0
+L 469 0
+L 469 531
+Q 828 903 1448 1529
+Q 2069 2156 2228 2338
+Q 2531 2678 2651 2914
+Q 2772 3150 2772 3378
+Q 2772 3750 2511 3984
+Q 2250 4219 1831 4219
+Q 1534 4219 1204 4116
+Q 875 4013 500 3803
+L 500 4441
+Q 881 4594 1212 4672
+Q 1544 4750 1819 4750
+Q 2544 4750 2975 4387
+Q 3406 4025 3406 3419
+Q 3406 3131 3298 2873
+Q 3191 2616 2906 2266
+Q 2828 2175 2409 1742
+Q 1991 1309 1228 531
+z
+" transform="scale(0.015625)"/>
+ </defs>
+ <use xlink:href="#DejaVuSans-30"/>
+ <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+ <use xlink:href="#DejaVuSans-32" x="95.410156"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_3">
+ <g id="line2d_6">
+ <g>
+ <use xlink:href="#meee343289d" x="57.6" y="219.736513" style="stroke: #000000; stroke-width: 0.8"/>
+ </g>
+ </g>
+ <g id="text_7">
+ <!-- 0.4 -->
+ <g transform="translate(34.696875 223.535732) scale(0.1 -0.1)">
+ <defs>
+ <path id="DejaVuSans-34" d="M 2419 4116
+L 825 1625
+L 2419 1625
+L 2419 4116
+z
+M 2253 4666
+L 3047 4666
+L 3047 1625
+L 3713 1625
+L 3713 1100
+L 3047 1100
+L 3047 0
+L 2419 0
+L 2419 1100
+L 313 1100
+L 313 1709
+L 2253 4666
+z
+" transform="scale(0.015625)"/>
+ </defs>
+ <use xlink:href="#DejaVuSans-30"/>
+ <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+ <use xlink:href="#DejaVuSans-34" x="95.410156"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_4">
+ <g id="line2d_7">
+ <g>
+ <use xlink:href="#meee343289d" x="57.6" y="175.812769" style="stroke: #000000; stroke-width: 0.8"/>
+ </g>
+ </g>
+ <g id="text_8">
+ <!-- 0.6 -->
+ <g transform="translate(34.696875 179.611988) scale(0.1 -0.1)">
+ <defs>
+ <path id="DejaVuSans-36" d="M 2113 2584
+Q 1688 2584 1439 2293
+Q 1191 2003 1191 1497
+Q 1191 994 1439 701
+Q 1688 409 2113 409
+Q 2538 409 2786 701
+Q 3034 994 3034 1497
+Q 3034 2003 2786 2293
+Q 2538 2584 2113 2584
+z
+M 3366 4563
+L 3366 3988
+Q 3128 4100 2886 4159
+Q 2644 4219 2406 4219
+Q 1781 4219 1451 3797
+Q 1122 3375 1075 2522
+Q 1259 2794 1537 2939
+Q 1816 3084 2150 3084
+Q 2853 3084 3261 2657
+Q 3669 2231 3669 1497
+Q 3669 778 3244 343
+Q 2819 -91 2113 -91
+Q 1303 -91 875 529
+Q 447 1150 447 2328
+Q 447 3434 972 4092
+Q 1497 4750 2381 4750
+Q 2619 4750 2861 4703
+Q 3103 4656 3366 4563
+z
+" transform="scale(0.015625)"/>
+ </defs>
+ <use xlink:href="#DejaVuSans-30"/>
+ <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+ <use xlink:href="#DejaVuSans-36" x="95.410156"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_5">
+ <g id="line2d_8">
+ <g>
+ <use xlink:href="#meee343289d" x="57.6" y="131.889026" style="stroke: #000000; stroke-width: 0.8"/>
+ </g>
+ </g>
+ <g id="text_9">
+ <!-- 0.8 -->
+ <g transform="translate(34.696875 135.688245) scale(0.1 -0.1)">
+ <defs>
+ <path id="DejaVuSans-38" d="M 2034 2216
+Q 1584 2216 1326 1975
+Q 1069 1734 1069 1313
+Q 1069 891 1326 650
+Q 1584 409 2034 409
+Q 2484 409 2743 651
+Q 3003 894 3003 1313
+Q 3003 1734 2745 1975
+Q 2488 2216 2034 2216
+z
+M 1403 2484
+Q 997 2584 770 2862
+Q 544 3141 544 3541
+Q 544 4100 942 4425
+Q 1341 4750 2034 4750
+Q 2731 4750 3128 4425
+Q 3525 4100 3525 3541
+Q 3525 3141 3298 2862
+Q 3072 2584 2669 2484
+Q 3125 2378 3379 2068
+Q 3634 1759 3634 1313
+Q 3634 634 3220 271
+Q 2806 -91 2034 -91
+Q 1263 -91 848 271
+Q 434 634 434 1313
+Q 434 1759 690 2068
+Q 947 2378 1403 2484
+z
+M 1172 3481
+Q 1172 3119 1398 2916
+Q 1625 2713 2034 2713
+Q 2441 2713 2670 2916
+Q 2900 3119 2900 3481
+Q 2900 3844 2670 4047
+Q 2441 4250 2034 4250
+Q 1625 4250 1398 4047
+Q 1172 3844 1172 3481
+z
+" transform="scale(0.015625)"/>
+ </defs>
+ <use xlink:href="#DejaVuSans-30"/>
+ <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+ <use xlink:href="#DejaVuSans-38" x="95.410156"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_6">
+ <g id="line2d_9">
+ <g>
+ <use xlink:href="#meee343289d" x="57.6" y="87.965282" style="stroke: #000000; stroke-width: 0.8"/>
+ </g>
+ </g>
+ <g id="text_10">
+ <!-- 1.0 -->
+ <g transform="translate(34.696875 91.764501) scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-31"/>
+ <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+ <use xlink:href="#DejaVuSans-30" x="95.410156"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_7">
+ <g id="line2d_10">
+ <g>
+ <use xlink:href="#meee343289d" x="57.6" y="44.041539" style="stroke: #000000; stroke-width: 0.8"/>
+ </g>
+ </g>
+ <g id="text_11">
+ <!-- 1.2 -->
+ <g transform="translate(34.696875 47.840758) scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-31"/>
+ <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+ <use xlink:href="#DejaVuSans-32" x="95.410156"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_12">
+ <!-- Elapsed time (sec) -->
+ <g transform="translate(28.617187 220.976438) rotate(-90) scale(0.1 -0.1)">
+ <defs>
+ <path id="DejaVuSans-45" d="M 628 4666
+L 3578 4666
+L 3578 4134
+L 1259 4134
+L 1259 2753
+L 3481 2753
+L 3481 2222
+L 1259 2222
+L 1259 531
+L 3634 531
+L 3634 0
+L 628 0
+L 628 4666
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-6c" d="M 603 4863
+L 1178 4863
+L 1178 0
+L 603 0
+L 603 4863
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-61" d="M 2194 1759
+Q 1497 1759 1228 1600
+Q 959 1441 959 1056
+Q 959 750 1161 570
+Q 1363 391 1709 391
+Q 2188 391 2477 730
+Q 2766 1069 2766 1631
+L 2766 1759
+L 2194 1759
+z
+M 3341 1997
+L 3341 0
+L 2766 0
+L 2766 531
+Q 2569 213 2275 61
+Q 1981 -91 1556 -91
+Q 1019 -91 701 211
+Q 384 513 384 1019
+Q 384 1609 779 1909
+Q 1175 2209 1959 2209
+L 2766 2209
+L 2766 2266
+Q 2766 2663 2505 2880
+Q 2244 3097 1772 3097
+Q 1472 3097 1187 3025
+Q 903 2953 641 2809
+L 641 3341
+Q 956 3463 1253 3523
+Q 1550 3584 1831 3584
+Q 2591 3584 2966 3190
+Q 3341 2797 3341 1997
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-70" d="M 1159 525
+L 1159 -1331
+L 581 -1331
+L 581 3500
+L 1159 3500
+L 1159 2969
+Q 1341 3281 1617 3432
+Q 1894 3584 2278 3584
+Q 2916 3584 3314 3078
+Q 3713 2572 3713 1747
+Q 3713 922 3314 415
+Q 2916 -91 2278 -91
+Q 1894 -91 1617 61
+Q 1341 213 1159 525
+z
+M 3116 1747
+Q 3116 2381 2855 2742
+Q 2594 3103 2138 3103
+Q 1681 3103 1420 2742
+Q 1159 2381 1159 1747
+Q 1159 1113 1420 752
+Q 1681 391 2138 391
+Q 2594 391 2855 752
+Q 3116 1113 3116 1747
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-74" d="M 1172 4494
+L 1172 3500
+L 2356 3500
+L 2356 3053
+L 1172 3053
+L 1172 1153
+Q 1172 725 1289 603
+Q 1406 481 1766 481
+L 2356 481
+L 2356 0
+L 1766 0
+Q 1100 0 847 248
+Q 594 497 594 1153
+L 594 3053
+L 172 3053
+L 172 3500
+L 594 3500
+L 594 4494
+L 1172 4494
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-69" d="M 603 3500
+L 1178 3500
+L 1178 0
+L 603 0
+L 603 3500
+z
+M 603 4863
+L 1178 4863
+L 1178 4134
+L 603 4134
+L 603 4863
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-6d" d="M 3328 2828
+Q 3544 3216 3844 3400
+Q 4144 3584 4550 3584
+Q 5097 3584 5394 3201
+Q 5691 2819 5691 2113
+L 5691 0
+L 5113 0
+L 5113 2094
+Q 5113 2597 4934 2840
+Q 4756 3084 4391 3084
+Q 3944 3084 3684 2787
+Q 3425 2491 3425 1978
+L 3425 0
+L 2847 0
+L 2847 2094
+Q 2847 2600 2669 2842
+Q 2491 3084 2119 3084
+Q 1678 3084 1418 2786
+Q 1159 2488 1159 1978
+L 1159 0
+L 581 0
+L 581 3500
+L 1159 3500
+L 1159 2956
+Q 1356 3278 1631 3431
+Q 1906 3584 2284 3584
+Q 2666 3584 2933 3390
+Q 3200 3197 3328 2828
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-28" d="M 1984 4856
+Q 1566 4138 1362 3434
+Q 1159 2731 1159 2009
+Q 1159 1288 1364 580
+Q 1569 -128 1984 -844
+L 1484 -844
+Q 1016 -109 783 600
+Q 550 1309 550 2009
+Q 550 2706 781 3412
+Q 1013 4119 1484 4856
+L 1984 4856
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-29" d="M 513 4856
+L 1013 4856
+Q 1481 4119 1714 3412
+Q 1947 2706 1947 2009
+Q 1947 1309 1714 600
+Q 1481 -109 1013 -844
+L 513 -844
+Q 928 -128 1133 580
+Q 1338 1288 1338 2009
+Q 1338 2731 1133 3434
+Q 928 4138 513 4856
+z
+" transform="scale(0.015625)"/>
+ </defs>
+ <use xlink:href="#DejaVuSans-45"/>
+ <use xlink:href="#DejaVuSans-6c" x="63.183594"/>
+ <use xlink:href="#DejaVuSans-61" x="90.966797"/>
+ <use xlink:href="#DejaVuSans-70" x="152.246094"/>
+ <use xlink:href="#DejaVuSans-73" x="215.722656"/>
+ <use xlink:href="#DejaVuSans-65" x="267.822266"/>
+ <use xlink:href="#DejaVuSans-64" x="329.345703"/>
+ <use xlink:href="#DejaVuSans-20" x="392.822266"/>
+ <use xlink:href="#DejaVuSans-74" x="424.609375"/>
+ <use xlink:href="#DejaVuSans-69" x="463.818359"/>
+ <use xlink:href="#DejaVuSans-6d" x="491.601562"/>
+ <use xlink:href="#DejaVuSans-65" x="589.013672"/>
+ <use xlink:href="#DejaVuSans-20" x="650.537109"/>
+ <use xlink:href="#DejaVuSans-28" x="682.324219"/>
+ <use xlink:href="#DejaVuSans-73" x="721.337891"/>
+ <use xlink:href="#DejaVuSans-65" x="773.4375"/>
+ <use xlink:href="#DejaVuSans-63" x="834.960938"/>
+ <use xlink:href="#DejaVuSans-29" x="889.941406"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_11">
+ <path clip-path="url(#p3572019ee8)" style="fill: none; stroke: #424242; stroke-width: 2.7; stroke-linecap: square"/>
+ </g>
+ <g id="line2d_12">
+ <path clip-path="url(#p3572019ee8)" style="fill: none; stroke: #424242; stroke-width: 2.7; stroke-linecap: square"/>
+ </g>
+ <g id="line2d_13">
+ <path clip-path="url(#p3572019ee8)" style="fill: none; stroke: #424242; stroke-width: 2.7; stroke-linecap: square"/>
+ </g>
+ <g id="line2d_14">
+ <path clip-path="url(#p3572019ee8)" style="fill: none; stroke: #424242; stroke-width: 2.7; stroke-linecap: square"/>
+ </g>
+ <g id="line2d_15">
+ <path clip-path="url(#p3572019ee8)" style="fill: none; stroke: #424242; stroke-width: 2.7; stroke-linecap: square"/>
+ </g>
+ <g id="line2d_16">
+ <path clip-path="url(#p3572019ee8)" style="fill: none; stroke: #424242; stroke-width: 2.7; stroke-linecap: square"/>
+ </g>
+ <g id="line2d_17">
+ <path clip-path="url(#p3572019ee8)" style="fill: none; stroke: #424242; stroke-width: 2.7; stroke-linecap: square"/>
+ </g>
+ <g id="line2d_18">
+ <path clip-path="url(#p3572019ee8)" style="fill: none; stroke: #424242; stroke-width: 2.7; stroke-linecap: square"/>
+ </g>
+ <g id="line2d_19">
+ <path clip-path="url(#p3572019ee8)" style="fill: none; stroke: #424242; stroke-width: 2.7; stroke-linecap: square"/>
+ </g>
+ <g id="patch_12">
+ <path d="M 57.6 307.584
+L 57.6 41.472
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+ </g>
+ <g id="patch_13">
+ <path d="M 414.72 307.584
+L 414.72 41.472
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+ </g>
+ <g id="patch_14">
+ <path d="M 57.6 307.584
+L 414.72 307.584
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+ </g>
+ <g id="patch_15">
+ <path d="M 57.6 41.472
+L 414.72 41.472
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+ </g>
+ <g id="legend_1">
+ <g id="patch_16">
+ <path d="M 64.6 108.1845
+L 220.10625 108.1845
+Q 222.10625 108.1845 222.10625 106.1845
+L 222.10625 48.472
+Q 222.10625 46.472 220.10625 46.472
+L 64.6 46.472
+Q 62.6 46.472 62.6 48.472
+L 62.6 106.1845
+Q 62.6 108.1845 64.6 108.1845
+z
+" style="fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter"/>
+ </g>
+ <g id="text_13">
+ <!-- Approach -->
+ <g transform="translate(118.6 58.070438) scale(0.1 -0.1)">
+ <defs>
+ <path id="DejaVuSans-41" d="M 2188 4044
+L 1331 1722
+L 3047 1722
+L 2188 4044
+z
+M 1831 4666
+L 2547 4666
+L 4325 0
+L 3669 0
+L 3244 1197
+L 1141 1197
+L 716 0
+L 50 0
+L 1831 4666
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-68" d="M 3513 2113
+L 3513 0
+L 2938 0
+L 2938 2094
+Q 2938 2591 2744 2837
+Q 2550 3084 2163 3084
+Q 1697 3084 1428 2787
+Q 1159 2491 1159 1978
+L 1159 0
+L 581 0
+L 581 4863
+L 1159 4863
+L 1159 2956
+Q 1366 3272 1645 3428
+Q 1925 3584 2291 3584
+Q 2894 3584 3203 3211
+Q 3513 2838 3513 2113
+z
+" transform="scale(0.015625)"/>
+ </defs>
+ <use xlink:href="#DejaVuSans-41"/>
+ <use xlink:href="#DejaVuSans-70" x="68.408203"/>
+ <use xlink:href="#DejaVuSans-70" x="131.884766"/>
+ <use xlink:href="#DejaVuSans-72" x="195.361328"/>
+ <use xlink:href="#DejaVuSans-6f" x="234.224609"/>
+ <use xlink:href="#DejaVuSans-61" x="295.40625"/>
+ <use xlink:href="#DejaVuSans-63" x="356.685547"/>
+ <use xlink:href="#DejaVuSans-68" x="411.666016"/>
+ </g>
+ </g>
+ <g id="patch_17">
+ <path d="M 66.6 72.748563
+L 86.6 72.748563
+L 86.6 65.748563
+L 66.6 65.748563
+z
+" style="fill: #1f77b4"/>
+ </g>
+ <g id="text_14">
+ <!-- Apache Arrow Flight SQL -->
+ <g transform="translate(94.6 72.748563) scale(0.1 -0.1)">
+ <defs>
+ <path id="DejaVuSans-77" d="M 269 3500
+L 844 3500
+L 1563 769
+L 2278 3500
+L 2956 3500
+L 3675 769
+L 4391 3500
+L 4966 3500
+L 4050 0
+L 3372 0
+L 2619 2869
+L 1863 0
+L 1184 0
+L 269 3500
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-46" d="M 628 4666
+L 3309 4666
+L 3309 4134
+L 1259 4134
+L 1259 2759
+L 3109 2759
+L 3109 2228
+L 1259 2228
+L 1259 0
+L 628 0
+L 628 4666
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-67" d="M 2906 1791
+Q 2906 2416 2648 2759
+Q 2391 3103 1925 3103
+Q 1463 3103 1205 2759
+Q 947 2416 947 1791
+Q 947 1169 1205 825
+Q 1463 481 1925 481
+Q 2391 481 2648 825
+Q 2906 1169 2906 1791
+z
+M 3481 434
+Q 3481 -459 3084 -895
+Q 2688 -1331 1869 -1331
+Q 1566 -1331 1297 -1286
+Q 1028 -1241 775 -1147
+L 775 -588
+Q 1028 -725 1275 -790
+Q 1522 -856 1778 -856
+Q 2344 -856 2625 -561
+Q 2906 -266 2906 331
+L 2906 616
+Q 2728 306 2450 153
+Q 2172 0 1784 0
+Q 1141 0 747 490
+Q 353 981 353 1791
+Q 353 2603 747 3093
+Q 1141 3584 1784 3584
+Q 2172 3584 2450 3431
+Q 2728 3278 2906 2969
+L 2906 3500
+L 3481 3500
+L 3481 434
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-53" d="M 3425 4513
+L 3425 3897
+Q 3066 4069 2747 4153
+Q 2428 4238 2131 4238
+Q 1616 4238 1336 4038
+Q 1056 3838 1056 3469
+Q 1056 3159 1242 3001
+Q 1428 2844 1947 2747
+L 2328 2669
+Q 3034 2534 3370 2195
+Q 3706 1856 3706 1288
+Q 3706 609 3251 259
+Q 2797 -91 1919 -91
+Q 1588 -91 1214 -16
+Q 841 59 441 206
+L 441 856
+Q 825 641 1194 531
+Q 1563 422 1919 422
+Q 2459 422 2753 634
+Q 3047 847 3047 1241
+Q 3047 1584 2836 1778
+Q 2625 1972 2144 2069
+L 1759 2144
+Q 1053 2284 737 2584
+Q 422 2884 422 3419
+Q 422 4038 858 4394
+Q 1294 4750 2059 4750
+Q 2388 4750 2728 4690
+Q 3069 4631 3425 4513
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-51" d="M 2522 4238
+Q 1834 4238 1429 3725
+Q 1025 3213 1025 2328
+Q 1025 1447 1429 934
+Q 1834 422 2522 422
+Q 3209 422 3611 934
+Q 4013 1447 4013 2328
+Q 4013 3213 3611 3725
+Q 3209 4238 2522 4238
+z
+M 3406 84
+L 4238 -825
+L 3475 -825
+L 2784 -78
+Q 2681 -84 2626 -87
+Q 2572 -91 2522 -91
+Q 1538 -91 948 567
+Q 359 1225 359 2328
+Q 359 3434 948 4092
+Q 1538 4750 2522 4750
+Q 3503 4750 4090 4092
+Q 4678 3434 4678 2328
+Q 4678 1516 4351 937
+Q 4025 359 3406 84
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-4c" d="M 628 4666
+L 1259 4666
+L 1259 531
+L 3531 531
+L 3531 0
+L 628 0
+L 628 4666
+z
+" transform="scale(0.015625)"/>
+ </defs>
+ <use xlink:href="#DejaVuSans-41"/>
+ <use xlink:href="#DejaVuSans-70" x="68.408203"/>
+ <use xlink:href="#DejaVuSans-61" x="131.884766"/>
+ <use xlink:href="#DejaVuSans-63" x="193.164062"/>
+ <use xlink:href="#DejaVuSans-68" x="248.144531"/>
+ <use xlink:href="#DejaVuSans-65" x="311.523438"/>
+ <use xlink:href="#DejaVuSans-20" x="373.046875"/>
+ <use xlink:href="#DejaVuSans-41" x="404.833984"/>
+ <use xlink:href="#DejaVuSans-72" x="473.242188"/>
+ <use xlink:href="#DejaVuSans-72" x="512.605469"/>
+ <use xlink:href="#DejaVuSans-6f" x="551.46875"/>
+ <use xlink:href="#DejaVuSans-77" x="612.650391"/>
+ <use xlink:href="#DejaVuSans-20" x="694.4375"/>
+ <use xlink:href="#DejaVuSans-46" x="726.224609"/>
+ <use xlink:href="#DejaVuSans-6c" x="783.744141"/>
+ <use xlink:href="#DejaVuSans-69" x="811.527344"/>
+ <use xlink:href="#DejaVuSans-67" x="839.310547"/>
+ <use xlink:href="#DejaVuSans-68" x="902.787109"/>
+ <use xlink:href="#DejaVuSans-74" x="966.166016"/>
+ <use xlink:href="#DejaVuSans-20" x="1005.375"/>
+ <use xlink:href="#DejaVuSans-53" x="1037.162109"/>
+ <use xlink:href="#DejaVuSans-51" x="1100.638672"/>
+ <use xlink:href="#DejaVuSans-4c" x="1179.349609"/>
+ </g>
+ </g>
+ <g id="patch_18">
+ <path d="M 66.6 87.426688
+L 86.6 87.426688
+L 86.6 80.426688
+L 66.6 80.426688
+z
+" style="fill: #ff7f0e"/>
+ </g>
+ <g id="text_15">
+ <!-- C -->
+ <g transform="translate(94.6 87.426688) scale(0.1 -0.1)">
+ <defs>
+ <path id="DejaVuSans-43" d="M 4122 4306
+L 4122 3641
+Q 3803 3938 3442 4084
+Q 3081 4231 2675 4231
+Q 1875 4231 1450 3742
+Q 1025 3253 1025 2328
+Q 1025 1406 1450 917
+Q 1875 428 2675 428
+Q 3081 428 3442 575
+Q 3803 722 4122 1019
+L 4122 359
+Q 3791 134 3420 21
+Q 3050 -91 2638 -91
+Q 1578 -91 968 557
+Q 359 1206 359 2328
+Q 359 3453 968 4101
+Q 1578 4750 2638 4750
+Q 3056 4750 3426 4639
+Q 3797 4528 4122 4306
+z
+" transform="scale(0.015625)"/>
+ </defs>
+ <use xlink:href="#DejaVuSans-43"/>
+ </g>
+ </g>
+ <g id="patch_19">
+ <path d="M 66.6 102.104813
+L 86.6 102.104813
+L 86.6 95.104813
+L 66.6 95.104813
+z
+" style="fill: #2ca02c"/>
+ </g>
+ <g id="text_16">
+ <!-- psql -->
+ <g transform="translate(94.6 102.104813) scale(0.1 -0.1)">
+ <defs>
+ <path id="DejaVuSans-71" d="M 947 1747
+Q 947 1113 1208 752
+Q 1469 391 1925 391
+Q 2381 391 2643 752
+Q 2906 1113 2906 1747
+Q 2906 2381 2643 2742
+Q 2381 3103 1925 3103
+Q 1469 3103 1208 2742
+Q 947 2381 947 1747
+z
+M 2906 525
+Q 2725 213 2448 61
+Q 2172 -91 1784 -91
+Q 1150 -91 751 415
+Q 353 922 353 1747
+Q 353 2572 751 3078
+Q 1150 3584 1784 3584
+Q 2172 3584 2448 3432
+Q 2725 3281 2906 2969
+L 2906 3500
+L 3481 3500
+L 3481 -1331
+L 2906 -1331
+L 2906 525
+z
+" transform="scale(0.015625)"/>
+ </defs>
+ <use xlink:href="#DejaVuSans-70"/>
+ <use xlink:href="#DejaVuSans-73" x="63.476562"/>
+ <use xlink:href="#DejaVuSans-71" x="115.576172"/>
+ <use xlink:href="#DejaVuSans-6c" x="179.052734"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ <defs>
+ <clipPath id="p3572019ee8">
+ <rect x="57.6" y="41.472" width="357.12" height="266.112"/>
+ </clipPath>
+ </defs>
+</svg>
diff --git a/benchmark/integer/select.c b/benchmark/integer/select.c
new file mode 100644
index 0000000..6d42494
--- /dev/null
+++ b/benchmark/integer/select.c
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/time.h>
+
+#include <libpq-fe.h>
+
+int
+main(int argc, char **argv)
+{
+ PGconn *connection = PQconnectdb("dbname=afs_benchmark");
+ PGresult *result;
+ struct timeval before;
+ struct timeval after;
+ int nFields;
+ int iField;
+ int nTuples;
+ int iTuple;
+
+ if (PQstatus(connection) != CONNECTION_OK)
+ {
+ fprintf(stderr, "failed to connect: %s", PQerrorMessage(connection));
+ PQfinish(connection);
+ return EXIT_FAILURE;
+ }
+
+ gettimeofday(&before, NULL);
+ result = PQexec(connection, "SELECT * FROM data");
+ if (PQresultStatus(result) != PGRES_TUPLES_OK)
+ {
+ fprintf(stderr, "failed to select: %s", PQerrorMessage(connection));
+ PQclear(result);
+ PQfinish(connection);
+ return EXIT_FAILURE;
+ }
+
+ nTuples = PQntuples(result);
+ nFields = PQnfields(result);
+ for (iTuple = 0; iTuple < nTuples; iTuple++)
+ {
+ for (iField = 0; iField < nFields; iField++)
+ {
+ PQgetvalue(result, iTuple, iField);
+ }
+ }
+ gettimeofday(&after, NULL);
+ printf("%.3fsec\n",
+ (after.tv_sec + (after.tv_usec / 1000000.0)) -
+ (before.tv_sec + (before.tv_usec / 1000000.0)));
+ PQclear(result);
+
+ return EXIT_SUCCESS;
+}
diff --git a/benchmark/integer/select.rb b/benchmark/integer/select.rb
new file mode 100755
index 0000000..bc2898c
--- /dev/null
+++ b/benchmark/integer/select.rb
@@ -0,0 +1,35 @@
+#!/usr/bin/env ruby
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+require "time"
+
+require "arrow-flight-sql"
+
+call_options = ArrowFlight::CallOptions.new
+call_options.add_header("x-flight-sql-database", "afs_benchmark")
+client = ArrowFlight::Client.new("grpc://127.0.0.1:15432")
+sql_client = ArrowFlightSQL::Client.new(client)
+
+before = Time.now
+info = sql_client.execute("SELECT * FROM data", call_options)
+endpoint = info.endpoints.first
+reader = sql_client.do_get(endpoint.ticket, call_options)
+table = reader.read_all
+# p table
+puts("%.3fsec" % (Time.now - before))
diff --git a/benchmark/integer/select.sql b/benchmark/integer/select.sql
new file mode 100644
index 0000000..7fe7117
--- /dev/null
+++ b/benchmark/integer/select.sql
@@ -0,0 +1,18 @@
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements. See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership. The ASF licenses this file
+-- to you under the Apache License, Version 2.0 (the
+-- "License"); you may not use this file except in compliance
+-- with the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing,
+-- software distributed under the License is distributed on an
+-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+-- KIND, either express or implied. See the License for the
+-- specific language governing permissions and limitations
+-- under the License.
+
+SELECT * FROM data;
diff --git a/dev/release/rat_exclude_files.txt b/dev/release/rat_exclude_files.txt
index bf47194..2b7dc1d 100644
--- a/dev/release/rat_exclude_files.txt
+++ b/dev/release/rat_exclude_files.txt
@@ -15,6 +15,8 @@
# specific language governing permissions and limitations
# under the License.
+benchmark/integer/result.csv
+benchmark/integer/result.svg
compile_commands.json
dev/release/apache-rat-*.jar
dev/release/filtered_rat.txt