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

Postgres 9.x中CHECK约束的成本是多少?

须彭亮
2023-03-14
问题内容

我有一张有60列的桌子。其中的20个是“ NotEmpty”和6个“ NotNull”。

我有空值和空值(在我的情况下,它们始终表示“无数据”)。我想只用一种约束来统一列。

我已读取null值很便宜(以字节为单位)。那么也许使用NotEmpty约束?但是,也许NotNull约束的执行效果更好?或者coalesce()在检索数据时最好同时拥有值和用途?

什么是成本CHECK的制约INSERTUPDATEPostgres里9.x中?您的经历如何?有基准吗?


问题答案:

有些人试图避免NULL价值观,声称这种逻辑会造成混乱。

我不是其中之一。NULL值仅适用于没有数据的列。它们无疑是存储“空”列的最便宜的方式-磁盘空间和性能(主要影响是较小的表和索引):

  • 在PostgreSQL中不使用NULL仍然在标题中使用NULL位图吗?
  • 在postgresql的列上设置“ NOT NULL”是否会提高性能?
  • 可空列会在PostgreSQL中占用额外的空间吗?

一旦 了解
NULL价值的本质,就没有理由避免它们。Postgres提供了多种函数来处理NULL。colaesce()nullif()concat()concat_ws(),…

通常,就 性能 而言, NOT NULL约束 胜过 CHECK约束, 并且两者均由对数 触发触发
。但是,即使是简单的触发器也很便宜。NOT NULL约束的成本几乎为零。同样,所有这些仅影响写操作,但是在大多数应用程序中,读操作占主导地位。

因此,对性能(除次优索引和查询之外)的影响 最大的 是表和索引的 大小 ,或更重要 的是每个数据页的元组数
。在大多数情况下,较大的元组会导致性能降低。满足查询所必须读取的数据页数相应增加。可用的高速缓存内存已较早饱和。

我还没有基准测试,但是最好还是针对您的特定环境进行测试。这些只是简单的经验法则。现实要复杂得多。



 类似资料:
  • SQL CHECK 约束 CHECK 约束用于限制列中的值的范围。 如果对单个列定义 CHECK 约束,那么该列只允许特定的值。 如果对一个表定义 CHECK 约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。 CREATE TABLE 时的 SQL CHECK 约束 下面的 SQL 在 "Persons" 表创建时在 "P_Id" 列上创建 CHECK 约束。CHECK 约束规定 "

  • 问题内容: 按照MySQL手册“该子句已解析,但所有存储引擎都将忽略它”。因此,我知道简单的解决方案是不可能的,但是还有另一种可行的方法来达到相同的结果吗?也许通过一些触发器或存储过程的使用?如果可以,怎么办? 同样,由于它只是“已解析”,是否还可以避免使用它,因为它没有用? 使用MySQL 5.5.11和InnoDB表 问题答案: 看看这篇有趣的文章 https://wikis.oracle.c

  • 问题内容: 首先,我创建了一个表,例如 然后在该表中插入值 MySQL没有显示错误,它接受了值。 问题答案: 如果您使用MySQL 8.0.15或更早版本,则MySQL参考手册会说: 该CHECK子句已解析,但所有存储引擎均将其忽略。 尝试触发… 希望能有所帮助。

  • 问题内容: 这个问题已经在这里有了答案 : MySQL中的CHECK约束不起作用 (8个答案) 2年前关闭。 我创建了带有检查约束的表计划: 当我插入违反检查约束的值时,sql报告没有错误。 我插入了一个在order_date之前的dely_date。 问题答案: 与中的约束一样被忽略 工作的实施例使用: LiveDemo 您可以使用触发器进行验证: SqlFiddleDemo

  • 本文向大家介绍关于sql脚本导入Oracle时重复生成check约束的问题解决,包括了关于sql脚本导入Oracle时重复生成check约束的问题解决的使用技巧和注意事项,需要的朋友参考一下 前言 最近在工作中一位细心的同事发现产品的全量sql脚本中有一些重复的check约束检查,就像下图这样的 重复脚本 怪异之处还在于,每次执行一遍该脚本,然后导出脚本,在导出脚本中重复的次数就会增加一遍。通过n

  • 我试图用postgresql在数据库中插入一些数据,但仍然显示相同的消息: 错误:关系“empleados”的新行违反了检查约束“ck_empleados_documento”详细信息:失败的行包含(13,22222222,f,Lopez,Ana,冒号123,1,2,casado,1990-10-10)。 我不知道错误在哪里或者是什么,也没有找到任何解决这个问题的方法。这是我试图插入的内容: 这是