当前位置: 首页 > 面试题库 >

大于或等于ALL()且等于MAX()速度

伏建修
2023-03-14
问题内容

我在PostgreSQL中有一个名为的关系,该关系product包含2个字段:idquantity,我想找到id具有最高值的产品quantity。据我所知,有两种方法可以做到:

SELECT id FROM product WHERE quantity >= ALL(SELECT quantity FROM product)

或者

SELECT id FROM product WHERE quantity = (SELECT MAX(quantity) FROM product)

他们的执行速度有什么不同吗?


问题答案:

如果有任何行,第一个查询将失败quantity IS NULL(如Gordon所示)。
仅当所有行都具有时,第二个查询才会失败quantity IS NULL。因此,它在大多数情况下应该是可用的。(而且速度更快。)

如果在 Postgres 12或更早版本中 需要NULL安全查询,即NULL是有效结果,请考虑:

SELECT id, quantity
FROM   product
WHERE  quantity IS NOT DISTINCT FROM (SELECT MAX(quantity) FROM product);

或者,可能更快:

SELECT id, quantity
FROM  (
   SELECT *, rank() OVER (ORDER BY quantity DESC NULLS LAST) AS rnk
   FROM   product
   ) sub
WHERE  rnk = 1;

看:

  • 与TOP n WITH TIES等效的PostgreSQL:是否限制“ with ties”?

Postgres 13 添加了标准的SQL子句 WITH TIES

SELECT id
FROM   product
ORDER  BY quantity DESC NULLS LAST
FETCH  FIRST 1 ROWS WITH TIES;

db
<>在这里拨弄

可使用任何数量的NULL值。

手册:

SQL:2008引入了不同的语法来实现相同的结果,PostgreSQL也支持该语法。它是:

OFFSET start { ROW | ROWS }
FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES }

在这种语法中,标准要求 _ start or _ count
值是文字常量,参数或变量名;作为PostgreSQL扩展,允许使用其他表达式,但通常需要将其括在括号中以避免歧义。如果 _ count_
FETCH子句中省略if ,则默认为1。此WITH TIES 选项用于根据该ORDER BY子句返回与结果集中最后一行相关的所有其他行;否则,默认为1 。ORDER BY在这种情况下是强制性的。ROWROWS以及FIRSTNEXT是不影响这些条款的影响干扰词。

值得注意的是,WITH TIES不能与(non-standard)short语法一起使用LIMIT n

这是 最快的解决方案 。比您当前的任何一个查询都要快。对于 性能而言 更重要:在上有一个
索引(quantity)。或更专业的覆盖索引允许仅索引扫描(速度稍快一点):

CREATE INDEX ON product (quantity DESC NULLS LAST) INCLUDE (id);

看:

  • PostgreSQL中的覆盖索引对JOIN列有帮助吗?

我们需要NULLS LAST使NULL值最后以降序排列。看:

  • 按ASC列排序,但先使用NULL值?


 类似资料:
  • 今天我注意到这个node.js代码: 给出输出 这很奇怪;如果某物不等于0或大于0,那么它为什么大于或等于0呢?发生什么事了?

  • 下面是有问题的代码: 目前,在

  • 我目前正在Codecademy上学习JavaScript,我遇到了一些问题。我在一个叫做“建造石头,布,剪刀”的部分,有一个部分有一个条件,如果数学。random()大于0.33小于0.66,计算机将选择纸张。我的问题是,如何建立一个if条件,即某个东西大于X,但同时小于Y?

  • 我有一个用电子和节点js编写的应用程序,我正在尝试运行。它使用模块端口扫描器来检查特定范围内的打开端口: 但是,我收到了这个错误: 即使我的范围显然小于65536,大于0。 在线查看,它似乎是节点v6中的错误(我有v6.5.0)。我是nodejs的新手,非常感谢有关如何解决此问题的任何帮助。谢谢。

  • 问题内容: 我有点被php / Mysql查询卡住了。我有2张桌子: 我需要这样的输出: 用户_1 = lvl0(因为用户有2分) User_2 = lvl1(因为用户刚达到10分) … User_4 = lvl2(因为用户尚未达到30分) 想你:) 问候。 问题答案: 你可以这样 小提琴 输出

  • 问题内容: MySQL中的varchar(max)等价于什么? 问题答案: varchar的最大长度取决于MySQL中的最大行大小,即64KB(不包括BLOB): 但是,请注意,如果使用多字节字符集,则限制会更低: 这里有些例子: 最大行大小为65535,但是varchar还包括一个或两个字节来编码给定字符串的长度。因此,即使它是表中的唯一列,您实际上也无法声明最大行大小的varchar。 但是,