首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在N1ql中将计数(*)替换为计数(1)可以吗?

在N1ql中将计数(*)替换为计数(1)可以吗?
EN

Stack Overflow用户
提问于 2020-07-31 03:43:17
回答 2查看 492关注 0票数 1

在这种情况下,我将使用n1ql中的所有记录进行计数

代码语言:javascript
运行
复制
Select count(*) from bucket where type='xyz' and column1='abc'.

这大约需要25秒,但如果我用count(1)替换它,则需要19秒。我的问题是我们可以用count(1)代替count(*)吗?我相信它只计算一栏总数,而不是全部计数。如果n1ql中没有这种情况,请告诉我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-31 12:58:56

如果您使用的CB 5.0及以上,计数(*)和计数(1)是相同的。

以下内容应该表现得更好。

代码语言:javascript
运行
复制
CREATE INDEX ix1 ON bucket(column1) WHERE type = "xyz";
SELECT COUNT(1) AS cnt
FROM bucket
WHERE type='xyz' AND column1='abc';
票数 2
EN

Stack Overflow用户

发布于 2020-07-31 05:45:39

  1. 专注于count(1)。数据库引擎遍历整个表,但不从中获取值。服务器层在每一行中放置一个数字"1“并返回,判断其不能为空,并按行进行累加。

  1. 专注于count(*).It,需要从磁盘读取数据,然后累加计数。数据库引擎将总行数存储在磁盘上的表中,因此执行count(*)将直接返回此数目的行数。如果使用count(*),则不会使用任何字段,也不会使用taken.Because值--它是按行累加的。数据库已经专门针对它进行了优化。

  1. 你也可以count(PRIMARY KEY Id)。数据库引擎返回的Id包括解析数据行和复制字段值。

  1. 或者你也可以count(Field)。如果此“字段”定义为null,则从记录行逐行读取该字段,判断其不能为空,并按行进行累加;如果允许此“字段”定义为null,则在执行该“字段”定义时,判断该字段可能为空,我们需要取出该值并再次判断,如果它不为空,则进行累加。

最后,,让我们对效率进行排序:

count(*)>=count(1)>count(id)>count(field)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63185453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档