Oracle 12c - “number”列上的索引比“varchar”列上的索引执行得更快吗?

2024-02-28

假设我在 Oracle 12c 中有一个表,其中包含以下列:

create table t1 (
a number (5,0),
b varchar (5,0)
d ...
e ...
);

然后我在具有相同值的两列中插入 100,000,000 条记录 - 例如

20151 and '20152' ... (for a first record)
20152 and '20152' ... (for a second record)
20153 and '20153' ... (for a third record)
...

然后我在列上添加索引 1'a'和列上的索引 2'b'.

问题是 - 当针对列执行查询时,查询的执行速度是否同样快'a'如列中所示'b' (e.g. join基于列与其他表进行查询'a'或基于列'b' or WHERE任一列上的子句)?

另外 - 会在 ' 上使用索引varchar' 列 - 使用比在 'number' 列上使用索引更多的 CPU?

Thanks.


[TL;DR]使用日期来存储日期,使用数字来存储数字,使用字符串来存储字符串。

资源使用情况如何?

Oracle 存储NUMBER数据类型为每 2 位 1 个字节。

Oracle 存储CHAR数据类型为每个 ASCII 字符 1 个字节(对于扩展集中的字符,UTF-8 和其他编码可能需要更多字节),并将用空格字符右填充字符串,以便字符串的长度完全相同。

Oracle 存储VARCHAR2数据类型为每个 ASCII 字符 1 个字节加上字符串长度的少量开销(1 或 2 个字节)。

Oracle 存储DATE数据类型为7 bytes https://stackoverflow.com/q/13568193/1509264(2 代表年,1 代表月、日、时、分、秒)。

基于你之前的问题 https://stackoverflow.com/q/47043564/1509264你似乎正在存储year and quarter假设您总是有 4 位数的年份和 1 位数的季度,那么:

  • NUMBER(5,0)需要 3 个字节;
  • CHAR(5 CHARACTER)需要 5 个字节;
  • VARCHAR2(5 CHARACTER)需要 6 个字节;和
  • DATE将占用 7 个字节。

所以只考虑内存aNUMBER(5,0)将是最有效的。

However

一旦您开始对存储为数字/字符串的年份/季度进行算术运算,就会遇到性能问题:

例如,获取下一个季度:

  • If quarter is a NUMBER数据类型,那么你可以使用:CASE WHEN MOD(quarter,10) = 4 THEN quarter + 7 ELSE quarter + 1 END但是当您想要添加 5 个季度或开始减去季度时,这无法处理,然后逻辑开始变得更加复杂。
  • If quarter is a CHAR数据类型,那么您可以将其转换为数字或日期并使用其中任何一种方法(字符串操作不太可能有效)。
  • If quarter is a DATE那么你只需要使用ADD_MONTHS( quarter, 3 ).

The DATE方法是自记录的并且已经存在,而NUMBER方法只会成为您的近似值的自定义函数QUARTER数据类型,一旦您实现了所需的所有比较和操作函数,您将有效地重写DATE将数据类型设置为季度的 UDT,这些函数的性能将不如优化的日期函数。

不要使用不适当的数据类型——仅将日期存储为日期;数字就是数字;和字符串作为字符串。

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

Oracle 12c - “number”列上的索引比“varchar”列上的索引执行得更快吗? 的相关文章

  • 如何选择集合的第一个元素作为查询的列

    表 t 有两列 a 和 b a是整数 b是集合 我想为每一行选择 a 和集合 b 的第一个值 我试过了 但没用 WITH s a b AS SELECT 1 ff FROM DUAL UNION ALL SELECT 1 ee FROM D
  • 删除超过 2 个月的分区

    我有一个基于日期字段进行分区的表 现在 我必须编写一个过程来删除所有超过 2 个月的分区 即 test date 超过 2 个月 我该怎么做 create table test table test id number test date
  • 打印 sqlalchemy 行

    我想做的就是打印 sqlalchemy 表行的一行 假设我有 from sqlalchemy import Column Integer String from sqlalchemy ext declarative import decla
  • Elasticsearch 单个字段的多个分析器

    我使用严格的预定义映射将不同类型的文档存储在单个索引中 它们都有一些字段 例如 body 但我希望在索引时对它们进行稍微不同的分析 例如 对特定文档使用不同的标记过滤器 并在搜索时以相同的方式处理 据我所知 分析器不能按文档指定 我还考虑使
  • ERROR 188 (HY000): FTS 查询超出结果缓存限制 mysql

    我的表的文本列上有全文索引 约有 1100 万行 表结构 CREATE TABLE review id int 11 NOT NULL AUTO INCREMENT comments text COLLATE utf8mb4 unicode
  • 实体框架将本地数据添加到数据库中的列表

    我对实体框架相当陌生 我正在使用此方法来查询我的数据库 var context new StudioEntities var results context tblStudios Select u gt new u Standort u N
  • 有没有由 HTML + css + javascript 驱动的 sql 编辑器? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 语法高亮 sql代码格式 代码镜像 http codemirror net 会成功的 这太好了 非常容
  • Oracle使用with子句创建表

    我可以从使用形成的查询创建表吗with clause Sure CREATE TABLE t AS WITH some data AS SELECT 1 as some value FROM dual UNION ALL SELECT 2
  • 如何为 Weblogic 10.3.6 启用 Java 持久性 2.0

    我正在使用 eclipse 和 weblogic 服务器 为了将项目添加到 weblogic 服务器 它需要支持 Java Persistance 2 0 但是当尝试安装它时 我不断收到此消息 在 Weblogic Server 安装中启用
  • Oracle group by 中的字符串聚合

    我已经形成了一个大型查询 它使用以下数据条件获取大型数据集 Column1 Column2 M1 OTH M1 HHM M1 RES M2 HHM M2 RES M3 OTH M3 RES 我需要将其形成为 M1 OTH HHM RES M
  • Oracle 12 对 SQL 中的本地集合类型有问题吗?

    长话短说 我建议讨论下面看到的代码 运行时 Oracle 11 编译器引发 PLS 00306 调用 PIPE TABLE 时参数提示的数量或类型错误 PLS 00642 SQL 语句中不允许使用本地集合类型 Oracle 12编译下面的包
  • 在不使用 PHP 的情况下将 MYSQL 中的表字段更新为其值加上常量

    我想表演一个UPDATE in MYSQL其中我获取一个字段值 添加一个常量并将新值保存在同一字段中 假设我们有一个名为OldValue在一个名为aTable 伪代码可能是 UPDATE aTable SET OldValue OldVal
  • SQL选择符号||是什么意思意思是?

    什么是 在 SQL 中做什么 SELECT a b AS letter 表示字符串连接 不幸的是 字符串连接不能在所有 sql 方言之间完全移植 ANSI SQL 中缀运算符 mysql concat 可变参数函数 caution 表示 逻
  • jQuery Cycle 插件 - 如何返回当前显示幻灯片的索引号?

    我目前正在使用Malsup 的 Cycle 插件 http jquery malsup com 我只是想知道是否可以让循环插件返回当前显示幻灯片的索引号 我想在特定幻灯片处于活动状态时更改页面内容 不知道如何实现这一点 你可以这样做 on
  • 查找一列中具有相同值而另一列中具有其他值的行?

    我有一个 PostgreSQL 数据库 将用户存储在users他们参与的表格和对话conversation桌子 由于每个用户可以参与多个对话 并且每个对话可以涉及多个用户 因此我有一个conversation user链接表来跟踪哪些用户正
  • SQL Server 2005 - 达到表行大小限制

    有没有一种干净的方法可以在向表添加新列之前确定表的行大小 并且不超过 8060 字节的限制 例如 如果表行长度当前为 8055 字节 并且我想添加日期时间 8 字节 则这将结束 因为它将变为 8063 字节 不包括空映射 但是 如果我添加一
  • 如何在 SQL 中的时区中使用“America/New_York”

    我有这段代码在 SQL 中运行良好 但是我想使用不同的时区格式 例如 America New York 代替 US Eastern Standard Time SELECT TODATETIMEOFFSET CAST CURRENT TIM
  • SQL Server 数据库中的表具有互斥外键的最佳实践

    在这里 我正在寻找针对以下问题的优缺点的最佳解决方案 Entity1 E1 pk 与其他不同的列 Entity2 E2 pk 与其他不同的列 Entity3 E3 pk 与其他不同的列 我需要创建之间的关系Entity1 and Entit
  • SQL查询:按字符长度排序?

    是否可以按字符总数对sql数据行进行排序 e g SELECT FROM database ORDER BY data length 我想你想用这个 http dev mysql com doc refman 5 0 en string f
  • 如何在 where 子句中使用别名? [复制]

    这个问题在这里已经有答案了 可能的重复 在 WHERE 子句中引用列别名 https stackoverflow com questions 8370114 referring to a column alias in a where cl

随机推荐

  • NSNumberFormatter 不允许输入十进制数字

    我对 NSNumberFormatter 的使用感到非常困惑 这应该非常简单 但我无法让它工作 我想设置一个 NSTextField 以允许输入带小数点或不带小数点的十进制数字 这是我认为可行的 NSNumberFormatter form
  • 从现有 Makefile 创建 CMakeLists 文件

    我想用cmake为 C 项目生成构建文件 我有一个现有的Makefile 我在生成这个时遇到问题Makefile使用标准cmake句法 如何包含标准 C 库 例如 lstdc lpthread lboost thread mt in the
  • Django 使用 locals() [重复]

    这个问题在这里已经有答案了 我是 Django Web 开发的初学者 我注意到locals 使用函数代替我习惯看到的上下文字典 据我在网上看到的locals 非常有用 那么是否有任何特殊情况 这不是真的 最好使用context dictio
  • Heroku Django,模板不存在错误

    因此 经过几个深夜的工作 我终于将我的应用程序部署到 Heroku 上 但现在出现了不同的问题 彻夜难眠 模板不存在 错误 我使用的是 Django 1 11 所以我的设置如下 INSTALLED APPS django contrib a
  • 有类似 Buffer.Last Position Of 的东西吗?查找缓冲区中最后一次出现的字符?

    我有一个类型的缓冲区ReadOnlySequence
  • 即席只读查询是否存储在 SQL Server 事务日志中?

    在 SQL Server 2008 中 数据库恢复模型配置为full 是诸如 从表名中选择 col1 col2 col3 记录到事务日志文件中 换句话说 我可以使用事务日志备份确定特定一天在数据库上运行了哪些查询吗 不会 事务日志根本不记录
  • RethinkDB:​​Javascript - 如何删除嵌套对象

    我在尝试从表中删除嵌套对象而不意外删除过程中的所有数据时遇到了相当大的困难 现在发生了三次 感谢上帝我制作了副本 我的对象 value1 thing value2 thing value3 thing roles 1 name Dave i
  • Kotlin - 如何在子类中返回“自身类型”? (不带扩展功能)

    让我们来学习这些课程 class A fun foo A this class B A fun bar 现在我希望 Kotlin 能够检测到我何时调用foo on B 然后给我输入的结果B 这样我就可以写 B foo bar 对于 kotl
  • javascript setInterval 的内存泄漏

    这两种说法有什么区别吗 setInterval animateImage 1000 or setInterval animateImage 1000 浏览器 js 引擎是否会以任何不同的方式解释第二个语句 从而可能导致内存泄漏或性能问题 情
  • 由于不同的病毒扫描程序导致 Microsoft Visual Studio 速度变慢

    与 Microsoft Visual Studio 一起使用的最慢的病毒扫描程序是什么 由于我的病毒检查器 我刚刚让 Microsoft Visual Studio 再次 变慢 数百个项目 其中一些包含超过 100 个 C 文件 因此任何减
  • 如何通过按 Enter 退出 while 循环?

    I am trying to get a while loop to break by pressing the Enter key on a keyboard My code is package javaapplication4 imp
  • Android Espresso 执行长按而不是单击

    onData anything inAdapterView withId R id ScheduleOrderListViewListView atPosition 0 perform click 50 的时间执行长触摸 有没有好的解决方法
  • 用于收集对象的 Rails 模型类方法

    我在编写用于集合的类方法时遇到问题ActiveRecord对象 在过去的几个小时里 我已经两次遇到这个问题 这似乎是一个简单的问题 所以我知道我错过了一些东西 但我无法在其他地方找到答案 Example class Order lt Act
  • 无法在设备上调试应用程序

    我的所有设备都工作正常 这个特定的设备是三星的 但没有 当我插入手机时 手机会显示在 DDMS 设备列表中 但是 没有任何应用程序 进程出现 这是唯一发生这种情况的设备 是的 USB 调试已启用 是的 debuggable 在清单中设置为
  • css嵌入无滚动条

    好吧 我有一个带有 ajax 按钮的页面 当您点击 ajax 按钮时 它会将一个嵌入对象扔到 data div 中 一切正常 我的问题是嵌入正在创建一个我不想要的滚动条 关于如何防止滚动条有什么想法吗 我已经尝试过在任何地方都可以抛出 ov
  • Webgl使用视口+剪刀更新区域

    我一直在尝试创建一个多视口 webgl 应用程序 对于每个视图 我使用视口 剪刀将所有内容渲染得非常好 但现在我想改进渲染并只渲染更新的视图 因此跳过过度绘制 我做了一个小演示来展示这个想法 http kile stravaganza or
  • LIMIT then RAND 而不是 RAND then LIMIT

    我正在使用全文搜索来提取行 我根据分数对行进行排序 ORDER BY SCORE 然后在前 20 行 LIMIT 20 中 我想对结果集进行兰特 RAND 操作 因此 对于任何特定的搜索词 我想随机显示前 20 个结果中的 5 个 我的解决
  • MSI 安装程序错误 2810 中断安装,但仍然顺利完成

    我创建了一个安装应用程序的设置 并且仍然如此 但它最后开始突然发出奇怪的警告 因此 当安装过程完成时 会出现以下内容 安装程序在安装此软件包时遇到意外错误 这可能表明此包有问题 错误代码是2810 于是我查了2810 上面写着 在对话框 2
  • Angularjs 1.7.9 - 可能未处理的拒绝[重复]

    这个问题在这里已经有答案了 我经常遇到这个错误Possibly unhandled rejection即使在使用时 promise then success err or promise then success catch err 我应该
  • Oracle 12c - “number”列上的索引比“varchar”列上的索引执行得更快吗?

    假设我在 Oracle 12c 中有一个表 其中包含以下列 create table t1 a number 5 0 b varchar 5 0 d e 然后我在具有相同值的两列中插入 100 000 000 条记录 例如 20151 an