postgresql - 在字符串中实现每个查询的结果

标签 postgresql jdbc clojure

我是 Clojure 的新手,正在开发一个 jdbc 应用程序,其中我有一个字符串,其中定义了三个查询,如下所示。

(def tpch_query15
      (str "create view revenue0 (supplier_no, total_revenue) as select l_suppkey, sum(l_extendedprice * (1 - l_discount)) "
        "from lineitem where l_shipdate >= date '1993-04-01' and l_shipdate < date '1993-04-01' + interval '3' month group by l_suppkey; "
            "select s_suppkey, s_name, s_address, s_phone, total_revenue from supplier, revenue0 where s_suppkey = supplier_no "
        "and total_revenue = (select max(total_revenue) from revenue0) order by s_suppkey LIMIT 1; drop view revenue0"))

(defn run-a-query
  "Run a query three times and return the average time."
  [conn-db query queryno]
  (println (str "Running query " queryno))
  (let [starttime (System/currentTimeMillis)]
    (dotimes [n 3]
      (try
        (let
          [rs (sql/query conn-db query)]
        ;; Print column names with | as delimiter
        (dorun 0 (map #(println (clojure.string/join " | " (keys %))) rs))
        ;; Print a seperator between column names and rows
        (println "------------------------------------------------------")
        ;; Print rows with | as delimiter
        (dorun (map #(println (clojure.string/join " | " (vals %))) rs)))
        (catch Exception e)))
      (/ (- (System/currentTimeMillis) starttime) 3.0)))

;;https://clojuredocs.org/clojure.core/conj!
(defn run-all-queries
  "Run all TPC-H queries. Return a vector of average time taken for each query."
  [conn-db]
  (loop [i 0 v (transient [])]
    (if (< i 22)
      (recur (inc i) (conj! v (run-a-query conn-db (get queries-to-run i) (+ i 1))))
      (persistent! v))))

是否可以让运行查询函数打印该字符串中定义的所有三个查询的结果。当前,当运行查询被传递给 tpch_query15 时,它不会打印出任何结果。据我了解,这是因为三个查询中的最后一个是下拉 View 不返回结果集,它只会返回最后一个查询结果。

最佳答案

使用 WITH 子句 (https://www.postgresql.org/docs/current/static/queries-with.html) 将您的查询重新表述为单个 SQL SELECT 语句,而不是创建然后删除 View :

with
  revenue0 (supplier_no, ...) as (select l_suppkey, ... )
select s_suppkey, ...
from supplier, revenue0,...

无论是否使用 Clojure、JDBC 等,您实际上都不需要 View 。而且在任何情况下,在同一连接上(尤其是在同一请求中)将 DDL 与查询/DML 混合通常不是一个好主意 -性能可能会受到很大影响,具体取决于数据库、版本、驱动程序等。

关于postgresql - 在字符串中实现每个查询的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38443484/

相关文章:

android - 如何将Mysql JDBC Driver 到android studio

mysql - 在Java应用程序中使用JDBC并行读取大数据的标准算法或模式

clojure - 为什么 Clojure 中的 (/1/2) 等于 2N?

clojure - 如何在 Clojure 中将字符串转换为函数?

java - 如何在 Windows 中将 PostgreSQL 作为服务运行?

arrays - 需要直接在 PostgreSQL 数据库中插入结构

python - 非阻塞客户端中的事务?

postgresql - 以读写模式打开备用 Postgres 数据库进行测试

java - JDBC驱动程序实现和类加载

尾部调用优化失败时 Clojure 警告/错误