SQL 计数(*) 性能

2024-03-29

我有一个包含超过 2000 万行的 SQL 表 BookChapters。它有一个聚集主键 (bookChapterID),并且没有任何其他键或索引。运行以下查询需要几毫秒

if (select count(*) from BookChapters) = 0
...

然而,当我这样改变时,需要10多分钟

if (select count(*) from BookChapters) = 1
...

or

if (select count(*) from BookChapters) > 1
...

这是为什么? 我怎样才能得到select count(*)执行得更快?


Mikael Eriksson 在下面很好地解释了为什么第一个查询很快:

SQL Server 将其优化为:if exists(select * from BookChapters)。因此,它会查找是否存在一行,而不是计算表中的所有行。

对于另外两个查询,SQL Server 将使用以下规则。执行类似的查询SELECT COUNT(*),SQL Server将使用最窄的非聚集的索引来计算行数。如果表中没有任何 非聚集索引,则必须扫描表。

另外,如果您的桌子上有聚集的索引,您可以使用以下查询更快地获得计数(从此站点借用)快速获取行数! http://dbatipster.blogspot.com/2009/08/get-row-counts-fast.html)

--SQL Server 2005/2008/2016/2017/2019/2022
SELECT OBJECT_NAME(i.id) [Table_Name], i.rowcnt [Row_Count]
FROM sys.sysindexes i WITH (NOLOCK)
WHERE i.indid in (0,1)
ORDER BY i.rowcnt desc

--SQL Server 2000
SELECT OBJECT_NAME(i.id) [Table_Name], i.rows [Row_Count]
FROM sysindexes i (NOLOCK)
WHERE i.indid in (0,1)
ORDER BY i.rows desc

它使用 sysindexes 系统表。您可以在这里找到更多信息SQL服务器 https://learn.microsoft.com/en-us/sql/relational-databases/system-compatibility-views/sys-sysindexes-transact-sql.

这是另一个链接为什么我的 SELECT COUNT(*) 运行这么慢? https://www.dcac.com/sql/why-is-my-select-count-running-so-slow/与另一种解决方案。它展示了当您右键单击表并选择属性时,Microsoft 使用快速显示行数的技术。

select sum (spart.rows)
from sys.partitions spart
where spart.object_id = object_id(’YourTable’)
and spart.index_id < 2

您应该发现,无论您有多少张桌子,它都会很快返回。

如果您使用的是 SQL 2000,则可以使用 sysindexes 表来获取该数字。

select max(ROWS)
from sysindexes
where id = object_id(’YourTable’)

这个数字可能会略有偏差,具体取决于 SQL 更新 sysindexes 表的频率,但它通常是正确的(或至少足够接近)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL 计数(*) 性能 的相关文章

  • 如何将 T-SQL 中的结果连接到列中?

    我正在处理一个查询 它应该给我这样的结果 Name Surname Language Date James Hetfield en gb fr 2011 01 01 Lars Ulrich gb fr ca 2011 01 01 但我的选择
  • PIVOT 运算符中指定的列名“FirstName”与 PIVOT 参数中的现有列名冲突

    当我尝试替换时收到以下错误消息null to zero PIVOT 运算符中指定的列名 jan 与 PIVOT 参数中的现有列名称 查询如下 select from select isnull jan 0 isnull feb 0 sum
  • 带有 viewbags 的 MVC 数据集

    如何将数据集放入视图袋中并在视图中显示结果 我有一个来自模型的数据集 并将其写入视图包 我想使用 foreach 循环从视图中的视图包中获取数据行 我已经有一个变量进入视图 所以我无法正常传递数据集 每页我还会有许多其他数据集 所以我认为
  • 动态SQL生成列名?

    我有一个查询 我正在尝试将行值转换为列名称 目前我正在使用SUM Case As ColumnName 声明 像这样 SELECT SKU1 SUM Case When Sku2 157 Then Quantity Else 0 End A
  • 将两个sql查询合并为一个查询

    如何组合以下 2 个查询以便获得两列 PAYMODE 和付款类型 两个查询都很相似 并且针对同一个表 将两个 sql 查询合并为一个查询 这样我就不需要执行两个单独的查询 SELECT ETBL DESC TXT as PAYMODE FR
  • 出于安全目的,您是否有理由不执行自己的算法来打乱 ID?

    我计划实现我自己的非常简单的 哈希 公式 为具有多个用户的应用程序添加一层安全性 我目前的计划如下 用户创建一个帐户 此时后端会生成一个 ID ID 通过公式运行 假设 ID 57 8926 36 7 或同样随机的东西 然后 我将新的用户
  • 我应该增强客户端上的 Jquery Mobile 元素还是发送带有 data-enhance="false" 的增强标记?

    我有一个产品搜索 我正在发送回结果 每个结果都包含两个按钮 JQM 控制组 我一次发送 24 条记录 因此需要增强 24 个控制组 如下所示 div class submitButton linkBox div
  • VBA仅清除数据透视表缓存,但保留数据透视表结构

    如何使用VBA清除数据透视表缓存 但不破坏数据透视表结构 我的数据透视表已连接到外部数据源 SQL 源决定哪个用户应该查看数据的哪一部分 当表刷新时 源会填充该表 我想保存 Excel 文件并使用干净的数据透视表 内部没有数据 分发它 结果
  • PDO 库比本机 MySQL 函数更快吗?

    我已经阅读了几个与此相关的问题 但我担心它们可能已经过时 因为自这些问题得到解答以来 更新版本的 PDO 库已经发布 我编写了一个 MySQL 类 它构建查询并转义参数 然后根据查询返回结果 目前这个类正在使用内置的mysql函数 我很清楚
  • 如何读取 GPU 负载?

    我正在编写一个程序 用于监控计算机的各种资源 例如CPU使用率等 我还想监控 GPU 使用情况 GPU 负载 而不是温度 using System using System Collections Generic using System
  • SQL:将现有列设置为 MySQL 中的主键

    我有一个包含 3 列的数据库 id name somethingelse 该表没有设置索引 我收到 未定义索引 在 phpmyadmin 中id 是一个 7 位字母数字值 每行都是唯一的 我想将 Drugid 设置为主键 索引 我不知道有没
  • MS Access:在列中搜索星号/星号

    我正在寻找一种方法来搜索包含字符串数据类型的列 问题是星号或星号是保留符号 以下查询无法正常工作 select from users where instr pattern 如何编写 Access 查询来搜索列中的星号 您可以使用方括号在
  • 如何更改 Amazon Redshift 中的默认时区?

    默认情况下将时间戳列设置为 SYSDATE 将其存储为UTC 是否可以更改时区 以便 SYSDATE 将日期和时间存储到不同的时区 到目前为止 我已经检查了SET http docs aws amazon com redshift late
  • 如何查询多对多表(一个表的值成为列标题)

    给定此表结构 我想展平多对多关系 并将一个表的名称字段中的值设置为列标题 并将同一表中的数量设置为列值 目前可行的想法是将值放入字典 哈希表 中并用代码表示这些数据 但我想知道是否有 SQL 方法可以做到这一点 我还使用 Linq to S
  • 动态 SQL 和 where case 哪个更好?

    我需要创建一个带有 12 个参数的存储过程 并使用这些参数的不同组合来过滤查询 所有 12 个参数都不是强制性的 就好像我传递 3 5 或 12 个参数取决于用户输入的搜索输入一样 我可以通过两种方式创建 即使用动态 SQL 查询或使用 C
  • PostgreSQL:在所有表字段的长度上创建索引

    我有一张桌子叫profile 我想按照填写最多的内容对它们进行排序 每列都是 JSONB 列或 TEXT 列 我不需要很大程度的确定性 所以通常我会按如下方式订购 SELECT FROM profile ORDER BY LENGTH CO
  • Oracle 查询向上或向下舍入到最近的 15 分钟间隔

    08 SEP 20 08 55 05 08 SEP 20 15 36 13 下面的查询对于 15 36 13 可以正常工作 因为它四舍五入到 15 30 但 8 55 05 向下舍入到 08 45 而它应该四舍五入到 09 00 selec
  • 列的 SQL MAX(包括其主键)

    Short 从下面的 sql select 中 我获取了 cart id 和该购物车中最高价值商品的值 SELECT CartItems cart id MAX ItemValues value FROM CartItems INNER J
  • 当我耗尽 bigint 生成的密钥时会发生什么?怎么处理呢?

    我自己无法想象一个好的答案 所以我想在这里问 在我心里 我总是想知道 如果AUTO INCREMENT PRIMARY ID我的专栏MySQL表用完了吗 举例来说 我有一个有两列的表 一个ID auto increment primary
  • 将存储过程的结果加上额外的列插入表中

    如何在其中插入更多列dbFileListOnly表以及 EXEC 查询 INSERT INTO admindb dbfilelistonly path col1 col2 path EXEC RESTORE FILELISTONLY FRO

随机推荐

  • 通过另一个对象数组过滤对象数组

    我想通过另一个对象数组过滤对象数组 我有 2 个这样的对象数组 const array id 1 name a1 sub id 6 name a1 sub id 2 name a2 sub null id 3 name a3 sub id
  • 传单自定义图标在缩放时调整大小。性能图标与 divicon

    我试图在放大传单时调整自定义图标的大小 我为此想出了两种解决方案 一个使用L Icon标签 另一个使用L divIcon 在这两个示例中 为了便于阅读 我仅设置了 1 个标记和组 Method 1 using L Icon 用标记进行分组
  • 无法使用 jQuery.load 将外部页面加载到我页面的 div 中

    我无法将外部 html 页面加载到我页面的 div 中 我的 Jquery 代码是 document ready function var url http www google com get url function response
  • Pandas:根据更复杂的标准选择和修改数据框

    我在看this https stackoverflow com questions 38802675 create bool mask from filter results in pandas and this https stackov
  • 如何更改默认的 Google Cloud 用户名?

    我是 Google Cloud Platform GCP 的新手 我尝试创建一个新的虚拟机 但默认用户名很烦人 比如说 我的 Gmail 是 电子邮件受保护 cdn cgi l email protection 用户名将为 example
  • Recyclerview水平扑克牌效果

    我正在尝试制作简单的纸牌游戏 我需要展示桌子上的一副纸牌水平地用户可以通过单击选择任意数量的卡片 理想情况下 当使用单击任何卡时 卡应比其他卡稍微抬高一点 另外卡片不是完全可见的 它们是部分可见的 例如this https d2gg9evh
  • PHP 计数数组中的值

    我有这样的代码 span Mali Oglasi span p p 如何计算数组内的特定值 例如我想计算有多少结果i
  • 递归赋值

    def swap aList if len aList 0 return 0 elif len aList 1 print aList 0 return aList 0 return aList 0 swap aList 2 aList a
  • 创建并使用 Babel 插件而不将其设为 npm 模块

    在我的项目中 我使用带有 require 钩子的 Babel 6 我需要加载我编写的自定义 babel 插件 但是我真的需要先使用 npm 发布我的插件 然后将插件名称包含在我的主项目中吗 babelrc 有没有办法直接加载插件代码 换句话
  • 将SQL Server 2005查询结果导出到SQL INSERT语句?

    SQL Server 2005 中有没有一种简单的方法可以将查询结果导出到 SQL INSERT 语句 我正在考虑如何使用数据库资源管理器将现有存储过程编写到新查询窗口中 我们希望将一些数据从开发数据库转移到生产数据库 我了解链接服务器 但
  • Maven 构建错误 - 无法执行目标 org.apache.maven.plugins:maven- assembly-plugin:2.5.5

    我正在尝试使用 Maven 构建项目 不幸的是我没有使用maven的经验所以我有点无助 这很可能是由 riak 子模块引起的 这是带有代码的 github 存储库 YCSB https github com LordFazole YCSB
  • 如何将网格设置为 Items 控件的模板?

    我正在尝试创建一个ItemsControl使用网格作为其ItemsPanel以这样的方式 它有两列 其中第一列宽度是该列中最宽项目的宽度 并且具有显示所有项目所需的尽可能多的行 基本上 我想要以下内容 但不知何故在一个ItemsContro
  • 使用 Rails 更新附加到 Postgresql 中的文本列

    预先感谢您对此提供的任何帮助 我有一个 Rails 模型 其中包含 postgresql 文本列 我想追加 即mycolumn mycolumn newdata 数据添加到现有列 我想要生成的 sql 如下所示 update MyOjbs
  • Akka 2:如何暂停消息处理?

    在我使用 Akka 掌握 Actor 模型的过程中 出现了很多问题 这是另一张 假设我们有一个 Actor 由于某些业务逻辑或可用资源 它必须在给定时间内停止处理消息 可能发生这种情况的情况可能是 节流 可能有一个发送电子邮件的 Actor
  • gcc 可以配置为不打印警告/错误消息中的完整路径吗?

    当 gcc 打印出警告或错误时 它会显示包含错误的文件的完整路径 是否有一个标志可以将输出缩短为仅文件名 这仅取决于您如何调用 gcc tmp c gcc Wall bad c bad c 1 warning return type def
  • 如何在 BigQuery 中通过每个用户的线性插值来填充不规则缺失的时间序列值?

    我有丢失的数据时间序列价值观不规律对于每个用户 我想使用 BigQuery 标准 SQL 通过线性插值以一定的间隔对其进行转换 name time value Jane 2020 11 14 09 01 00 3 Jane 2020 11
  • Django 无法加载模板标签

    我创建了一个templatetags我的应用程序内的文件夹和名为的文件内posts py 我写了以下代码 from django template import Library Node from advancedviews models
  • 如何检查 Jetpack Compose 中列表项的可见性

    FlatList of React Native有财产viewabilityConfigCallbackPairs您可以在其中设置 viewabilityConfig itemVisiblePercentThreshold 50 waitF
  • 从 csv 文件复制 cassandra 表

    我正在我的 Mac 带有 Oracle jdk1 7 0 55 的 Mac OS X Yosemite 上为 Cassandra Apache Spark 和 Flume 设置演示环境 该景观应作为新分析平台的概念证明 因此我需要在我的 c
  • SQL 计数(*) 性能

    我有一个包含超过 2000 万行的 SQL 表 BookChapters 它有一个聚集主键 bookChapterID 并且没有任何其他键或索引 运行以下查询需要几毫秒 if select count from BookChapters 0