I have two tables that contain key-value data that I want to combine in
pivoted form into a single result set. They are related to two separate
tables.

The tables are: test_results, test_variables, metric_def, metadata_key. The
latter two tables are enum-like tables, basic descriptors of data stored in
other tables. The former two tables are basically key-value tables (with
ids as well); these k-v tables are related to the latter two tables via
foreign keys.

The following SQL takes about 11 seconds to run on a high-end laptop. The
largest table is about 54k records, pretty puny.

Can someone provide a hint as to why this is so slow? Again, I am a noob to
SQL, so the SQL is probably poorly written.

Thanks in advance,

Bob

select

    t.id_name,
    max(t.begin_time) as begin_time,
    max(t.end_time) as end_time,

    max(case when (m.id_name = 'package-version') then v.value end) as
package_version,
    max(case when (m.id_name = 'database-vendor') then v.value end) as
database_vendor,
    max(case when (m.id_name = 'bean-name') then v.value end) as bean_name,
    max(case when (m.id_name = 'request-distribution') then v.value end) as
request_distribution,
    max(case when (m.id_name = 'ycsb-workload') then v.value end) as
ycsb_workload,
    max(case when (m.id_name = 'record-count') then v.value end) as
record_count,
    max(case when (m.id_name = 'transaction-engine-count') then v.value
end) as transaction_engine_count,
    max(case when (m.id_name = 'transaction-engine-maxmem') then v.value
end) as transaction_engine_maxmem,
    max(case when (m.id_name = 'storage-manager-count') then v.value end)
as storage_manager_count,
    max(case when (m.id_name = 'test-instance-count') then v.value end) as
test_instance_count,
    max(case when (m.id_name = 'operation-count') then v.value end) as
operation_count,
    max(case when (m.id_name = 'update-percent') then v.value end) as
update_percent,
    max(case when (m.id_name = 'thread-count') then v.value end) as
thread_count,

    max(case when (d.id_name = 'tps') then r.value end) as tps,
    max(case when (d.id_name = 'Memory') then r.value end) as memory,
    max(case when (d.id_name = 'DiskWritten') then r.value end) as
disk_written,
    max(case when (d.id_name = 'PercentUserTime') then r.value end) as
percent_user,
    max(case when (d.id_name = 'PercentCpuTime') then r.value end) as
percent_cpu,
    max(case when (d.id_name = 'UserMilliseconds') then r.value end) as
user_milliseconds,
    max(case when (d.id_name = 'YcsbUpdateLatencyMicrosecs') then r.value
end) as update_latency,
    max(case when (d.id_name = 'YcsbReadLatencyMicrosecs') then r.value
end) as read_latency,
    max(case when (d.id_name = 'Updates') then r.value end) as updates,
    max(case when (d.id_name = 'Deletes') then r.value end) as deletes,
    max(case when (d.id_name = 'Inserts') then r.value end) as inserts,
    max(case when (d.id_name = 'Commits') then r.value end) as commits,
    max(case when (d.id_name = 'Rollbacks') then r.value end) as rollbacks,
    max(case when (d.id_name = 'Objects') then r.value end) as objects,
    max(case when (d.id_name = 'ObjectsCreated') then r.value end) as
objects_created,
    max(case when (d.id_name = 'FlowStalls') then r.value end) as
flow_stalls,
    max(case when (d.id_name = 'NodeApplyPingTime') then r.value end) as
node_apply_ping_time,
    max(case when (d.id_name = 'NodePingTime') then r.value end) as
node_ping_time,
    max(case when (d.id_name = 'ClientCncts') then r.value end) as
client_connections,
    max(case when (d.id_name = 'YcsbSuccessCount') then r.value end) as
success_count,
    max(case when (d.id_name = 'YcsbWarnCount') then r.value end) as
warn_count,
    max(case when (d.id_name = 'YcsbFailCount') then r.value end) as
fail_count

from test as t

    left join test_results as r on r.test_id = t.id
    left join test_variables as v on v.test_id = t.id
    left join metric_def as d on d.id = r.metric_def_id
    left join metadata_key as m on m.id = v.metadata_key_id

group by t.id_name

;

"GroupAggregate  (cost=5.87..225516.43 rows=926 width=81)"
"  ->  Nested Loop Left Join  (cost=5.87..53781.24 rows=940964 width=81)"
"        ->  Nested Loop Left Join  (cost=1.65..1619.61 rows=17235
width=61)"
"              ->  Index Scan using test_uc on test t  (cost=0.00..90.06
rows=926 width=36)"
"              ->  Hash Right Join  (cost=1.65..3.11 rows=19 width=29)"
"                    Hash Cond: (m.id = v.metadata_key_id)"
"                    ->  Seq Scan on metadata_key m  (cost=0.00..1.24
rows=24 width=21)"
"                    ->  Hash  (cost=1.41..1.41 rows=19 width=16)"
"                          ->  Index Scan using test_variables_test_id_idx
on test_variables v  (cost=0.00..1.41 rows=19 width=16)"
"                                Index Cond: (test_id = t.id)"
"        ->  Hash Right Join  (cost=4.22..6.69 rows=55 width=28)"
"              Hash Cond: (d.id = r.metric_def_id)"
"              ->  Seq Scan on metric_def d  (cost=0.00..1.71 rows=71
width=20)"
"              ->  Hash  (cost=3.53..3.53 rows=55 width=16)"
"                    ->  Index Scan using test_results_test_id_idx on
test_results r  (cost=0.00..3.53 rows=55 width=16)"
"                          Index Cond: (test_id = t.id)"

Reply via email to