PostgreSQL:创建索引以快速区分NULL和非NULL值

2024-02-01

考虑具有以下内容的 SQL 查询WHERE谓词:

...
WHERE name IS NOT NULL
...

Where name是 PostgreSQL 中的文本字段。

没有其他查询检查该值的任何文本属性,只是检查它是否是NULL或不。所以,完整的 btree 索引 http://www.postgresql.org/docs/9.3/static/indexes-types.html看起来有点矫枉过正,尽管它支持这种区别 http://www.postgresql.org/docs/9.3/static/indexes-types.html:

此外,索引列上的 IS NULL 或 IS NOT NULL 条件可以与 B 树索引一起使用。

什么是正确的PostgreSQL索引可以快速区分NULLs 来自非NULLs?


我的意思是你声称它在两个方面“过度杀伤”:在复杂性方面(使用 B 树而不只是列表)和空间/性能。

对于复杂性来说,这并不过分。 B 树索引更可取,因为deletes它将比某种“无序”索引更快(因为缺乏更好的术语)。 (无序索引需要完整索引扫描才能删除。)鉴于这一事实,无序索引的任何收益通常都会被其损害所抵消,因此开发工作是不合理的。

但是,对于空间和性能,如果您想要一个高度选择性的索引以提高效率,您可以包括WHERE索引上的子句,如中所述精美手册 http://www.postgresql.org/docs/9.3/static/sql-createindex.html:

CREATE INDEX ON my_table (name) WHERE name IS NOT NULL;

请注意,只有当该索引允许 PostgreSQL 忽略某个索引时,您才会看到它的好处。large执行查询时的行数。例如,如果 99% 的行有name IS NOT NULL,索引不会给你带来任何好处,而只是让全表扫描发生;事实上,它的效率会较低(如@CraigRinger https://stackoverflow.com/users/398670/craig-ringer注),因为它需要额外的磁盘读取。然而,如果只有 1% 的行有name IS NOT NULL,那么这意味着巨大的节省,因为 PostgreSQL 可以忽略查询的大部分表。如果您的表非常大,即使删除 50% 的行也可能是值得的。这是一个调优问题,索引是否有价值将在很大程度上取决于数据的大小和分布。

此外,如果您仍然需要另一个索引来存储数据,那么在空间方面几乎没有什么好处。name IS NULL行。看克雷格·林格的回答 https://stackoverflow.com/a/31966621/1394393了解详情。

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

PostgreSQL:创建索引以快速区分NULL和非NULL值 的相关文章

  • 如何在使用连接池时强制 SqlConnection 物理关闭?

    我明白 如果我实例化一个 SqlConnection 对象 我实际上是从连接池中获取一个连接 当我调用 Open 时 它将打开连接 如果我对该 SqlConnection 对象调用 Close 或 Dispose 方法 它将返回到连接池 但
  • 如何在不运行 PostgreSQL 服务器的情况下初始化 PostgreSQL 数据库

    在初始化脚本中 我想初始化 PostgreSQL 目录 但在此阶段不需要 也不希望 正在运行的 PostgreSQL 服务器 如果我只是创建集群 作为用户postgres initdb D 但是 我还需要创建 PostgreSQL 角色 创
  • postgreSql 中特定时间后表更新

    我已经在 postgres 中创建了表 现在我想在特定时间 例如 1 小时 后更新一行 我看到很多问题 例如 https dba stackexchange com questions 56424 column auto updated a
  • Mysql 中 UNION 子句的替代方案

    我有两张桌子 表 a 表 b table a ID 1 2 3 4 5 7 table b ID 2 3 4 5 6 我必须得到这样的输出而无需UNION命令 ID 1 2 3 4 5 6 7 注意 我有一个联合解决方案 select fr
  • 独立对列进行排序,使得所有空值都位于每列的最后

    这是一个名为的示例表animal name color fox brown fox red dog gold 现在 我想要的是这样的结果 fox dog brown gold red 名称应该是结果的列 不同颜色值作为行 我的第一个想法是
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • 了解 SSMS 2008 中关系的更新和删除规则

    当我们定义外键约束时 我对 SQL Server 2008 Management Studio 中的更新和删除规则的含义感到困惑 我也没有找到相关的帮助文档 例如F1帮助 这是屏幕快照 如果有人能描述它们的含义并推荐一些相关文档来阅读 我将
  • 在 MySQL 中使用 COUNT 时如何返回 0 而不是 null

    我使用此查询返回存储在 sTable 中的歌曲列表以及存储在 sTable2 中的总项目数 SQL queries Get data to display sQuery SELECT SQL CALC FOUND ROWS str repl
  • 在 SQL 数据库中存储“列表”的最正确方法是什么?

    因此 我读了很多关于如何将多个值存储到一个列中是一个坏主意 并且违反了数据标准化的第一条规则 令人惊讶的是 这不是 不要谈论数据标准化 所以我需要一些帮助 目前我正在为我工 作的地方设计一个 ASP NET 网页 我想根据此人所属的 Act
  • 跨多个表进行搜索,并在结果行中显示表名称

    如何构建 SQL 语句以跨多个平面不相关的表运行 并使用选择结果和结果来自的表的名称显示结果 这种情况是这样的 我有几个表 每个表都有相同的列名 这是我从外部各方收到的数据 并将其存储在不同的表中 相同的表看起来像 Table 1 pid
  • 为什么 SqlClient 在传递 SqlXml 时使用不必要的 XML 转换?

    我有一个关于从 C 代码将 xml 数据类型传递给查询的问题 首先 这是 SQL Server 上的一个表 CREATE TABLE dbo XmlTable id int IDENTITY 1 1 NOT NULL dat xml NOT
  • 用更轻的解决方案替换完整的 ORM(JPA/Hibernate):推荐的加载/保存模式?

    我正在开发一个新的 Java Web 应用程序 并且正在探索保存数据的新方法 对我来说是新方法 我主要有 JPA 和 Hibernate 的经验 但是 除了简单的情况之外 我认为这种完整的 ORM 可能会变得相当复杂 另外 我不太喜欢和他们
  • 内连接不重复,可以吗?

    鉴于这两个表 表 A1 有两行具有相同的值 a A1 a a 表 A2 有两行主键值为 A B 它们与 a 关联 A2 PK col2 A a B a 我想要的是 A1 和 A2 的连接并得到这个结果 a A a B 显然内连接在这里不起作
  • PESSIMISTIC_WRITE 是否锁定整个表?

    只是为了确保我正确理解事情是如何运作的 If I do em lock employee LockModeType PESSIMISTIC WRITE 它会仅阻止该实体吗 employee 或整个表Employees 如果重要的话 我正在谈
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • XML 解析:格式良好的检查:未声明的实体

    我正在使用 SSMS 2008 但收到以下错误 你知道这意味着什么吗 Msg 9448 Level 16 State 1 Line 4 XML parsing line 1 character 89 well formed check un
  • 在 postgres 查询中使用列表

    我有一个动态列表 list a b c d 所以长度可能会改变 我想在查询中比较这些列表值 select from student where name in all the list values 我想将列表值传递到此查询中 我怎样才能做
  • 如何使用 LAMBDA 表达式在 LINQ 中执行 IN 或 CONTAINS?

    我有以下 Transact Sql 我正在尝试将其转换为 LINQ 并且很挣扎 SELECT FROM Project WHERE Project ProjectId IN SELECT ProjectId FROM ProjectMemb
  • 在 Oracle 行的多个列上使用透视

    我在 Oracle 表中有以下示例数据 tab1 我正在尝试将行转换为列 我知道如何在某一列上使用 Oracle 数据透视表 但是否可以将其应用于多个列 样本数据 Type weight height A 50 10 A 60 12 B 4

随机推荐

  • 如何加载共享库而不加载其依赖项?

    说我有一个图书馆libfoo so 1 这取决于 根据ldd on libbar so 1 然而 libbar so 1目前不可用 我的应用程序需要调用一个函数libfoo so 1这不需要libbar so 1 at all 有没有办法加
  • 局部变量的内存可以在其作用域之外访问吗?

    我有以下代码 include
  • 使用Servlet API,如何确定请求是HTTP/1.0还是HTTP/1.1?

    我正在修复一个错误 该错误仅在客户端使用 HTTP 1 0 并且是在防火墙后面秘密地进行 Internet Explorer 代理 时才会显现出来 详细信息在这里 https issues apache org jira browse TA
  • 获取日期中的小时和分钟 (HH:MM)

    我只想得到hh mm从日期 我怎样才能得到这个 我已经尝试过这个 CONVERT VARCHAR 8 getdate 108 只需使用前 5 个字符 SELECT CONVERT VARCHAR 5 getdate 108
  • 在 Java 中,在被调用方法之前和之后运行方法

    我正在尝试编写一个 Java 程序 以便在调用方法A 首先是一个名为methodBeforeA 被调用 然后方法A 执行后 另一个方法被调用命名 方法AfterA 这与 Junit 使用注释 使用 Before Test After 所做的
  • python mechanize 处理两个同名参数

    我正在登录一个页面 其中奇怪地有一个名为的表单输入login email和两个表单输入称为login password 我需要设置两者的值 但直接调用form login password 抛出错误 File Library Python
  • 将整数向量转换为 0 到 1 之间浮点数的最快精确方法

    考虑一个随机生成的 m256i向量 有没有更快 更精确的方法将它们转换为 m256之间的浮点数向量0 包括在内 和1 仅 比除以float 1ull lt lt 32 这是我到目前为止所尝试过的 其中iRand是输入和ans是输出 cons
  • 当线程“等待”某些东西时会发生什么

    When an async method awaits a Task当前正在运行的线程会发生什么 我推测 在 UI 线程上 消息循环将恢复 而在线程池线程上 线程将被释放回线程池 但是如果手动启动线程会发生什么呢 还有其他类型的线程吗 我花
  • 强制删除 boost::signals2 中的槽

    我发现 boost signals2 使用某种连接槽的惰性删除 这使得很难使用连接来管理对象的生命周期 我正在寻找一种方法来强制在断开连接时直接删除插槽 任何有关如何通过以不同方式设计我的代码来解决问题的想法也将受到赞赏 这是我的场景 我有
  • 在 FluentAssertions 中自定义失败处理

    我尝试使用 FluentAssertions 不仅作为测试断言框架 而且还检查运行时契约 例如高级 Debug Assert 并且我已阅读this https stackoverflow com questions 49724379 sho
  • 空手道 - 如何在 java 文件中使用 karate-config.js 变量?

    我有一个 DB utils java 文件 我需要根据运行代码的环境加载数据库用户名密码 并且需要从 karate config js 导入这些环境值 如何实现这一目标 只需使用嵌入表达式即可 所以如果你有dbusername and db
  • Python 多处理:如何在错误后干净地退出?

    我正在编写一些使用的代码multiprocessing模块 然而 由于我是新手 经常发生的情况是弹出一些错误 导致主应用程序停止运行 但是 该应用程序的子级仍然保持运行 并且我得到一长串正在运行的列表pythonw我的任务管理器列表中的进程
  • 在 varchar 列中查找非数字值

    要求 通用查询 函数 用于检查表中 varchar 列中提供的值是否实际上是数字且精度不超过允许的精度 可用值 表名称 列名称 允许的精度 允许的小数位数 一般建议是创建一个函数并使用 to number 来验证该值 但它不会验证允许的长度
  • 如何在 Android 键盘上添加“下一步”

    我在某些应用程序中看到键盘中出现一个名为 next 的按钮 它将焦点放在下一个编辑文本上 我想将其添加到我的应用程序中 你知道我该怎么做吗 或者它仅在应用程序的键盘上 多谢 抱歉 我没有这方面的更多信息 在edittext的布局中添加and
  • C/C++ 中结构体的字段对齐

    结构体的成员是用 C C 封装的吗 我所说的打包是指它们是紧凑的 并且字段之间没有内存空间 这不是对齐的意思 并且不保证任何特定的对齐或打包 元素将按顺序排列 但编译器可以在其选择的位置插入填充 这其实creates 有用的 对齐 例如 对
  • Angular 服务与导出

    我有一组简单的工具方法 没有任何状态可以在应用程序中共享 不需要是单例 也不需要任何注入的服务 使用注射服务有什么优势吗 Injectable export class DateService public convertStringToD
  • SDL 错误架构 x86_64“_SDL_main”的未定义符号

    我在 mac os x 上将 C 与 SDL Cocoa 和 Foundation 框架结合使用 我收到以下错误 Undefined symbols for architecture x86 64 SDL main referenced f
  • 如何在 Jekyll / Github 页面站点的 config.yml 中的新选项卡中打开 URL?

    我是自学成才 对 Jekyll 和 Github Pages 完全陌生 并且想知道如何在 config yml 页面中使用 markdown 在新选项卡中打开 URL This https aweekj github io Kiko plu
  • 添加不同的形状到 d3 力布局

    我试图将不同的形状添加到我的 d3 力布局中 但没有成功 最终目标是根据节点对象本身的属性确定形状 我使用 Selection enter 然后 append 形状像这样 由于力导向布局仅采用一组节点 而 append 采用字符串而不是函数
  • PostgreSQL:创建索引以快速区分NULL和非NULL值

    考虑具有以下内容的 SQL 查询WHERE谓词 WHERE name IS NOT NULL Where name是 PostgreSQL 中的文本字段 没有其他查询检查该值的任何文本属性 只是检查它是否是NULL或不 所以 完整的 btr