diff --git a/resources/migrations/037_add_query_hash_and_indexes.yaml b/resources/migrations/037_add_query_hash_and_indexes.yaml new file mode 100644 index 0000000000000000000000000000000000000000..22bd1799130f9a32a3c3854d34ce072fec401645 --- /dev/null +++ b/resources/migrations/037_add_query_hash_and_indexes.yaml @@ -0,0 +1,30 @@ +databaseChangeLog: + - changeSet: + id: 37 + author: tlrobinson + changes: + - addColumn: + tableName: query_queryexecution + columns: + - column: + name: query_hash + type: int + constraints: + nullable: true + - addNotNullConstraint: + tableName: query_queryexecution + columnName: query_hash + columnDataType: int + defaultNullValue: 0 + - createIndex: + tableName: query_queryexecution + indexName: idx_query_queryexecution_query_hash + columns: + column: + name: query_hash + - createIndex: + tableName: query_queryexecution + indexName: idx_query_queryexecution_started_at + columns: + column: + name: started_at diff --git a/resources/migrations/liquibase.json b/resources/migrations/liquibase.json index 2ed788d166dacfcefb7a2a2a9861001a7d9c709e..c737773a3ddd37f606bebb8e0a0473e212c8d5d9 100644 --- a/resources/migrations/liquibase.json +++ b/resources/migrations/liquibase.json @@ -34,6 +34,7 @@ {"include": {"file": "migrations/033_add_physical_schema_tables.yaml"}}, {"include": {"file": "migrations/034_add_pulse_channel_enabled_field.yaml"}}, {"include": {"file": "migrations/035_modify_setting_value_length.yaml"}}, - {"include": {"file": "migrations/036_add_dashboard_filters_columns.yaml"}} + {"include": {"file": "migrations/036_add_dashboard_filters_columns.yaml"}}, + {"include": {"file": "migrations/037_add_query_hash_and_indexes.yaml"}} ] } diff --git a/src/metabase/api/dataset.clj b/src/metabase/api/dataset.clj index 13a6ba9113a34517530749fe0025b998269b6c4d..9bd074ddb43a1132623efbfa6621722eac1a04ac 100644 --- a/src/metabase/api/dataset.clj +++ b/src/metabase/api/dataset.clj @@ -40,7 +40,7 @@ ;; add sensible constraints for results limits on our query (let [query (assoc body :constraints dataset-query-api-constraints) running-times (db/select-field :running_time QueryExecution - :json_query (json/generate-string query) + :query_hash (hash query) {:order-by [[:started_at :desc]] :limit 10})] {:average (float (/ (reduce + running-times) diff --git a/src/metabase/query_processor.clj b/src/metabase/query_processor.clj index 8758fe4abbc5dec1f7ae9cbbecd8e321c24993a1..b0ceccc339cec6b3b5ab8abaee5abc447eb71e47 100644 --- a/src/metabase/query_processor.clj +++ b/src/metabase/query_processor.clj @@ -570,9 +570,11 @@ [query {:keys [executed_by]}] {:pre [(integer? executed_by)]} (let [query-uuid (.toString (java.util.UUID/randomUUID)) + query-hash (hash query) query-execution {:uuid query-uuid :executor_id executed_by :json_query query + :query_hash query-hash :query_id nil :version 0 :status :starting @@ -588,7 +590,7 @@ :start_time_millis (System/currentTimeMillis)} query (assoc query :info {:executed-by executed_by :uuid query-uuid - :query-hash (hash query) + :query-hash query-hash :query-type (if (mbql-query? query) "MBQL" "native")})] (try (let [result (process-query query)]