从具有50k记录的简单表中选择SELECT *似乎需要40秒

时间:2016-06-26 03:29:11

标签: sql sql-server postgresql timing

这是我的表:

CREATE TABLE public.logs (
  logid bigint NOT NULL DEFAULT nextval('applog_logid_seq'::regclass),
  applicationname character varying(50),
  loglevel character varying(10),
  logmessage character varying(500),
  stacktrace character varying(4096),
  occurredon timestamp without time zone,
  loggedon timestamp without time zone,
  username character varying(50),
  groupname character varying(50),
  useragent character varying(512),
  CONSTRAINT applog_pkey PRIMARY KEY (logid)
);

当我在其上运行SELECT *...时,在本地计算机上返回50000行需要40秒。我在SQL Server的本地安装上有相同的表,并且返回相同数量的数据只需不到一秒钟。

我正在为我们的新堆栈评估PostgreSQL,这对我非常关注。为什么我做错了/为什么PostgreSQL这么慢?

修改

以下是我从EXPLAIN (BUFFERS, ANALYZE, TIMING OFF) SELECT * FROM public.logs获得的内容:

enter image description here

所以看起来服务器将在大约6毫秒内执行此操作。我想这意味着所有开销都在pgAdmin III中,但SSMS如何能够更快地完成这项任务?

2 个答案:

答案 0 :(得分:3)

非常感谢大家帮助我从悬崖上说话:)

我编写了一个节点控制台应用程序应用程序,让我的问题上床。事实上,我的Postres实例比SQL Server高出约50%(正如@Guillaume F.指出的那样)。在同一客户端,结果如下:

  

Postres(RDS)查询持续时间:7062ms

     

返回的Postres(RDS)行:50000

     

Postgres(本地)查询时长:1919ms

     

返回Postgres(Local)行:46154

     

MSSQL(本地)查询持续时间:4681毫秒

     

返回的MSSQL(本地)行:50000

以下是示例应用,如果有人有兴趣在自己的环境中复制我的搜索结果:

let pgp = require('pg-promise')();
let db = pgp("postgres://username:password@server:5432/db");
let localdb = pgp("postgres://username:password@server:5432/db");

db.result('select * from logs')
    .then(r => {
        console.log("Postres (RDS) rows returned:", r.rows.length);
        console.log("Postres (RDS) query duration:", r.duration + 'ms\n');
        return localdb.result('select * from logs')
            .then(r => {
                console.log("Postgres (Local) rows returned:", r.rows.length);
                console.log("Postgres (Local) query duration:", r.duration + 'ms\n');
            })
    })
    .catch(error=> {
        console.log(error);
    });

编辑:(由pg-promise作者提供)

另一方面,这只是为了展示如何以更文明的方式对PostgreSQL进行基准测试:

duration

使用方法result进行基准测试的优势在于pg-promise会自动使用属性<!DOCTYPE html> <html> <head> <style> div { background-color: lightgrey; width: 290px; padding: 25px; margin: 20px; } </style> </head> </style> <body> <div> <audio controls> <source src="Too High.ogg" type="audio/ogg"> <source src="Too High.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> </div> <div> <audio controls> <source src="Visions of the mind.ogg" type="audio/ogg"> <source src="Visions of the mind.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> </div> <div> <audio controls> <source src="Let me know.ogg" type="audio/ogg"> <source src="Let me know.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> </div> </body> </html> 扩展Result

答案 1 :(得分:3)

正如我们所怀疑的,正如我们从EXPLAIN输出中看到的那样,几乎没有时间花在服务器上,而是用于传输(网络延迟)和渲染输出。我们在您添加到问题的EXPLAIN输出中看到7毫秒。

在pgAdmin III中渲染大量文本并不是很快。两个提示:

  1. 大多数情况下,您不需要查看大列的所有内容。为了加快速度,您可以在pgAdmin III中设置最大显示字符数。但是如果你只看到长字符串的主要片段,不要感到困惑:

  2. pgAdmin 4 beta 2已经发布(2016-6-24)。尚未发布,但由于完全重写性能可能会有很大差异。 More on project's site.