Sql 执行*vs执行1

Sql 执行*vs执行1,sql,postgresql,query-performance,Sql,Postgresql,Query Performance,需要运行查询以查看至少一条记录存在的位置。因此,问题是什么更有效率: PERFORM * FROM table 或 为什么?我不知道你为什么要放弃结果 就我个人而言,我会使用以下内容: select count(*) into rows_exist from (select * from my_table limit 1) t; 保证返回值为0或1的单行,并且仅读取表中的单行才能执行此操作 至于1 vs*——我的直觉是,乐观主义者足够聪明,只需阅读回答问题所需的列 但是,如果运行查

需要运行查询以查看至少一条记录存在的位置。因此,问题是什么更有效率:

PERFORM * FROM table 


为什么?

我不知道你为什么要放弃结果

就我个人而言,我会使用以下内容:

select count(*)
into   rows_exist
from   (select * from my_table limit 1) t;
保证返回值为0或1的单行,并且仅读取表中的单行才能执行此操作

至于1 vs*——我的直觉是,乐观主义者足够聪明,只需阅读回答问题所需的列


但是,如果运行查询,则表明所有列都是从子查询投影的。如果是这种情况,则使用select*可能会降低效率,尤其是如果从表的开头删除了大量行,并且使用select*会导致在找到第一个块之前在完整表扫描中读取许多块。我欢迎PostgreSQL内部专家的意见,看看这是否是对计划的正确解释。

应该注意的是,首先,PERFORM不是SQL指令,它是一个plpgsql关键字,指示解释器运行等效的SELECT,然后丢弃结果

根据文件:

执行查询; 这将执行查询并丢弃结果。同样地编写查询 编写SQL SELECT命令的方式,但替换初始 关键字选择与执行。对于查询,请使用“执行”和“然后” 将查询放在括号中。在这种情况下,查询只能 返回一行。PL/pgSQL变量将被替换到查询中 与不返回结果的命令一样,计划也缓存在 同样的方式。此外,如果 查询至少生成一行,如果不生成行,则为false

所以问题与:如何从表中选择*和从表中选择1进行比较以检查表中是否至少有一行?但问题是,它们在性能方面都不充分,而且如果表中有许多行,它们实际上也不充分

让我们在最新的PostgreSQL 9.3上用两个大表测试一个真实示例:

wordsint,文本340万行,文本列总是很小 反向字索引,int,bytea,int~1000万行,bytea平均宽400字节,最大为2kB 查询会连续重复几次,在psql的\计时打开的情况下,我只保持最快的执行速度

使用第一个表进行测试1

从单词中执行1:

mlists=> do $$ begin perform 1 from words; end; $$; DO Time: 521,379 ms mlists=> do $$ begin perform * from words; end; $$; DO Time: 442,800 ms 从反向单词索引执行*操作:

mlists=> do $$ begin perform 1 from inverted_word_index ; end; $$; DO Time: 2206,230 ms mlists=> do $$ begin perform * from inverted_word_index ; end; $$; DO Time: 16848,971 ms
重复执行表明,两种构造的持续时间在0,3 ms和0,4 ms之间变化,没有赢家。它是如此之低,以至于速度差来自不相关的动力因素。

这不是我的问题。举个例子,我想问一下SELECT*是否比SELECT 1好?您还可以从中查看测试执行情况。如果要使用找到的特殊变量,则不需要*或1。@Daniel:SELECT或PERFORM WITH columns对于9.5版之前的PostgreSQL是一个语法错误 mlists=> do $$ begin perform * from inverted_word_index ; end; $$; DO Time: 16848,971 ms mlists=> do $$ begin perform 1 from words limit 1; end; $$; DO Time: 0,330 ms mlists=> do $$ begin perform * from words limit 1; end; $$; DO Time: 0,405 ms mlists=> do $$ begin perform 1 from inverted_word_index limit 1; end; $$; DO Time: 0,333 ms mlists=> do $$ begin perform * from inverted_word_index limit 1; end; $$; DO Time: 0,314 ms