diff --git a/tpc-h/pyproject.toml b/tpc-h/pyproject.toml index bbabebc..acf75f6 100644 --- a/tpc-h/pyproject.toml +++ b/tpc-h/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "iw-tpch" -version = "0.2.3" +version = "0.2.4" description = "TPC-H benchmark runner for Snowflake interactive and standard warehouses" requires-python = ">=3.13" dependencies = [ diff --git a/tpc-h/src/tpch/execution.py b/tpc-h/src/tpch/execution.py index 32725be..57f7304 100644 --- a/tpc-h/src/tpch/execution.py +++ b/tpc-h/src/tpch/execution.py @@ -75,6 +75,7 @@ def best_result(name: str, iteration: int, attempts: list[AttemptResult]) -> Que "client_elapsed_s": best["client_elapsed_s"], "query_id": best["query_id"], "attempt_query_ids": [a["query_id"] for a in ok_attempts], + "attempt_client_times": [a["client_elapsed_s"] for a in ok_attempts], "result_columns": best["columns"], "result_rows": best["rows"], "error": None, @@ -88,6 +89,7 @@ def best_result(name: str, iteration: int, attempts: list[AttemptResult]) -> Que "client_elapsed_s": last["client_elapsed_s"], "query_id": last["query_id"], "attempt_query_ids": [a["query_id"] for a in attempts if a["query_id"]], + "attempt_client_times": [a["client_elapsed_s"] for a in attempts], "error": last["error"], } @@ -108,6 +110,7 @@ def avg_result(name: str, iteration: int, attempts: list[AttemptResult]) -> Quer "client_elapsed_s": avg_elapsed, "query_id": last_ok["query_id"], "attempt_query_ids": [a["query_id"] for a in ok_attempts], + "attempt_client_times": [a["client_elapsed_s"] for a in ok_attempts], "result_columns": last_ok["columns"], "result_rows": last_ok["rows"], "error": None, @@ -121,6 +124,7 @@ def avg_result(name: str, iteration: int, attempts: list[AttemptResult]) -> Quer "client_elapsed_s": last["client_elapsed_s"], "query_id": last["query_id"], "attempt_query_ids": [a["query_id"] for a in attempts if a["query_id"]], + "attempt_client_times": [a["client_elapsed_s"] for a in attempts], "error": last["error"], } diff --git a/tpc-h/src/tpch/results.py b/tpc-h/src/tpch/results.py index 7f21365..2c8b066 100644 --- a/tpc-h/src/tpch/results.py +++ b/tpc-h/src/tpch/results.py @@ -42,6 +42,7 @@ def enrich_server_elapsed(conn, results: list[QueryResult], *, use_avg: bool = F r["server_elapsed_s"] = sum(servers) / len(servers) else: r["server_elapsed_s"] = min(servers) + r["attempt_server_times"] = servers def _stats(times: list[float]) -> dict: @@ -61,11 +62,21 @@ def summarize(results: list[QueryResult]) -> dict: ok = [r for r in results if r["status"] == "OK"] failed = [r for r in results if r["status"] != "OK"] validation_failed = [r for r in ok if r.get("validation") == "FAIL"] - client_times = [r["client_elapsed_s"] for r in ok] - server_times = [ - r["server_elapsed_s"] if r.get("server_elapsed_s") is not None else r["client_elapsed_s"] - for r in ok - ] + + unique_queries = set(r["query"] for r in results) + single_query = len(unique_queries) == 1 + + if single_query: + client_times = [t for r in ok for t in r.get("attempt_client_times", [r["client_elapsed_s"]])] + server_times = [t for r in ok for t in r.get("attempt_server_times", [])] + if not server_times: + server_times = client_times + else: + client_times = [r["client_elapsed_s"] for r in ok] + server_times = [ + r["server_elapsed_s"] if r.get("server_elapsed_s") is not None else r["client_elapsed_s"] + for r in ok + ] out = { "total_queries": len(results), "successful": len(ok), diff --git a/tpc-h/src/tpch/types.py b/tpc-h/src/tpch/types.py index 9823ef7..01c59a8 100644 --- a/tpc-h/src/tpch/types.py +++ b/tpc-h/src/tpch/types.py @@ -21,9 +21,11 @@ class QueryResult(TypedDict, total=False): client_elapsed_s: float query_id: str | None attempt_query_ids: list[str | None] + attempt_client_times: list[float] result_columns: list[str] result_rows: list[tuple[Any, ...]] server_elapsed_s: float | None + attempt_server_times: list[float] error: str | None validation: str validation_error: str | None diff --git a/tpc-h/uv.lock b/tpc-h/uv.lock index a2ea314..82bfdbf 100644 --- a/tpc-h/uv.lock +++ b/tpc-h/uv.lock @@ -223,7 +223,7 @@ wheels = [ [[package]] name = "iw-tpch" -version = "0.2.3" +version = "0.2.4" source = { editable = "." } dependencies = [ { name = "keyring" },