如何获得 COUNT(column) ... GROUP BY 来使用索引?

2023-12-23

我有一个表(col1,col2,...),其索引为(col1,col2,...)。该表中有数百万行,我想运行一个查询:

 SELECT col1, COUNT(col2) WHERE col1 NOT IN (<couple of exclusions>) GROUP BY col1

不幸的是,这会导致对表进行全表扫描,这需要一分钟以上的时间。有什么方法可以让oracle使用列上的索引来更快地返回结果吗?

EDIT:

更具体地说,我正在运行以下查询:

SELECT owner, COUNT(object_name) FROM all_objects GROUP BY owner

并且有一个索引SYS.OBJ$ (SYS.I_OBJ2) 索引owner# and name列;我相信我应该能够在查询中使用这个索引,而不是全表扫描SYS.OBJ$


我有机会尝试一下这个,我之前关于 NOT IN 的评论在这种情况下是转移注意力的。关键在于 NULL 的存在,或者更确切地说,索引列是否强制执行 NOT NULL 约束。

这将取决于您使用的数据库的版本,因为优化器随着每个版本的发布而变得更加智能。我使用的是 11gR1,优化器在所有情况下都使用索引,除了一种情况:当两列都为空并且我没有包含NOT IN clause:

SQL> desc big_table
 Name                                  Null?    Type
 -----------------------------------  ------    -------------------
 ID                                             NUMBER
 COL1                                           NUMBER
 COL2                                           VARCHAR2(30 CHAR)
 COL3                                           DATE
 COL4                                           NUMBER

如果没有 NOT IN 子句...

SQL> explain plan for
  2      select col4, count(col1) from big_table
  3      group by col4
  4  /

Explained.

SQL> select * from table(dbms_xplan.display)
  2  /

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------
Plan hash value: 1753714399

----------------------------------------------------------------------------------------
| Id  | Operation          | Name      | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |           | 31964 |   280K|       |  7574   (2)| 00:01:31 |
|   1 |  HASH GROUP BY     |           | 31964 |   280K|    45M|  7574   (2)| 00:01:31 |
|   2 |   TABLE ACCESS FULL| BIG_TABLE |  2340K|    20M|       |  4284   (1)| 00:00:52 |
----------------------------------------------------------------------------------------

9 rows selected.


SQL>

当我多布时NOT IN子句返回时,优化器选择使用索引。诡异的。

SQL> explain plan for
  2      select col4, count(col1) from big_table
  3      where col1 not in (12, 19)
  4      group by col4
  5  /

Explained.

SQL> select * from table(dbms_xplan.display)
  2  /

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------
Plan hash value: 343952376

----------------------------------------------------------------------------------------
| Id  | Operation             | Name   | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |        | 31964 |   280K|       |  5057   (3)| 00:01:01 |
|   1 |  HASH GROUP BY        |        | 31964 |   280K|    45M|  5057   (3)| 00:01:01 |
|*  2 |   INDEX FAST FULL SCAN| BIG_I2 |  2340K|    20M|       |  1767   (2)| 00:00:22 |
----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------

   2 - filter("COL1"<>12 AND "COL1"<>19)

14 rows selected.

SQL>

重复一下,在所有其他情况下,只要索引列之一被声明为非空,索引就会用于满足查询。对于早期版本的 Oracle 来说,情况可能并非如此,但它可能指明了前进的方向。

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

如何获得 COUNT(column) ... GROUP BY 来使用索引? 的相关文章

  • 表与视图的性能

    最近开始使用一个数据库 其中的惯例是为每个表创建一个视图 如果您假设表和视图之间存在一对一的映射 我想知道是否有人可以告诉我这样做对性能的影响 顺便说一句 这是在 Oracle 上的 假设问题是关于非物化视图 实际上取决于视图所基于的查询以
  • 从 all_tab_columns 中选择,其中表有 > 0 行

    我需要在大型数据库中搜索与列名匹配的表 但该表必须有超过 0 行 顺便说一句 这是查询 SELECT FROM all tab columns WHERE column name LIKE ID SUPPORT 您可以使用单个查询来过滤名称
  • 在 Oracle 过程中实现多线程

    我正在研究 Oracle 10gR2 这是我的问题 我有一个程序 我们称之为 proc parent 在包内 应该调用另一个过程 让我们调用它 用户创建 我得打电话 用户创建 在一个循环中 它从表中读取一些列 并且这些列值作为参数传递给 用
  • WHERE IN 条件不接受字符串值

    我正在动态构造一个带有名称的字符串用户数据在 PL Sql 过程中通过附加用户名 单引号 和逗号 的形式 abc123 xyz456 pqr789 但是当我将此字符串传递给 SELECT 语句的 WHERE IN 条件时 SELECT FR
  • 一个大连接或多个查询哪个提供更好的性能?

    我有一个名为订单的表 订单上的一列是 customer id我有一个名为 customers 的表 有 10 个字段 给定两个选项 如果我想构建订单对象数组并嵌入订单对象中的是客户对象 我有两个选择 选项1 A 首先查询订单表 b 循环遍历
  • 将 GROUP BY 与 FIRST_VALUE 和 LAST_VALUE 结合使用

    我正在处理一些当前以 1 分钟间隔存储的数据 如下所示 CREATE TABLE MinuteData Id INT MinuteBar DATETIME Open NUMERIC 12 6 High NUMERIC 12 6 Low NU
  • 如何记录更改列 DDL 操作

    我需要创建一个数据库触发器来记录每个更改 Add Column Modify Column Drop Column 使用Oracle的模式触发器在特定表中执行语句 如何获得 到目前为止我尝试了下面的代码 TRIGGER after ddl
  • 使用 createNativeQuery 调用 Oracle 存储过程

    我需要使用 JPA 调用存储过程并找到这篇文章 http www oracle com technology pub articles vasiliev jpql html http www oracle com technology pu
  • Oracle 中的函数与过程

    Oracle 中函数和过程的主要区别是什么 如果我可以用函数完成所有事情 为什么我必须使用过程 如果我无法在sql语句中调用过程 好吧 我会编写一个函数来完成相同的工作 过程不返回值 好的 在任何 dml 操作后我将仅返回 sql rowc
  • Oracle中如何检测4字节UTF8字符

    我们已经看到oracle中存储了4字节的UTF 8字符 我们需要检测特定列中有多少行包含此类字符 尝试了这里给出的建议 UTF 16 补充字符 https stackoverflow com questions 34720830 how t
  • 数百个别名/同义词与数据库表的完全限定名称

    考虑到多个模式中的数百个数据库表 在创建存储过程和视图时 您是否建议使用别名 同义词或完全限定名称 给定一些 schema table 像这样 Orders OrderHeader Production LineThroughput Sal
  • SQL统计高于和低于平均分的学生人数

    我在下面有一个示例表 我试图获取高于平均分数的学生人数和低于平均分数的学生人数 name subject classroom classarm session first term score first term grade std1 m
  • 如何查找elasticsearch 6.2.1中存在的索引?

    我试图检查elasticsearch 6 2 1的RestHighLevelClient中是否存在索引 目前我正在使用以下代码 try OpenIndexRequest openIndexRequest new OpenIndexReque
  • 查询中列的顺序重要吗?

    当从 MySQL 表中选择列时 与表中的顺序相比 选择列的顺序是否会影响性能 不考虑可能覆盖列的索引 例如 您有一个包含行 uid name bday 的表 并且有以下查询 SELECT uid name bday FROM table M
  • FROM 子句中的嵌套括号是否有效的 Oracle SQL 语法?

    此查询使用正确的 Oracle 语法吗 select from dual a where a dummy X 它可以在 11g 和 12c 中运行 但它是真正有效的语法吗 或者这只是一个编译器 错误 将来可能会修复 导致代码失败 我怀疑这是
  • REgex从oracle中的字符串中获取数字

    我有以下格式的字符串 阿克拉姆 88 jamesstree 20140418 阿克兰 8 约翰街 20140418 阿克兰 888 johnstreet 20140418 现在我只想检索 88 8 和 888 值 我为此编写了以下查询 SU
  • Oracle TDE 能否保护数据免受 DBA 的侵害?

    甲骨文专家 我的客户想要部署一个必须在数据库中保存信用卡号的应用程序 客户显然很关心安全性 我们特别关注一个令人痛苦的问题 我们如何确保只有具有 业务需要知道 的授权用户才可以访问数据 我们如何保护数据免受 DBA 的侵害 一个明显的解决方
  • mvc显示模板中当前项目的索引

    我有一个带有显示模板的 mvc 页面 如何获取显示模板中呈现的当前项目的索引 它在名称属性中产生正确的可绑定结果
  • Oracle:如何确定“AFTER ALTER”触发器中对象的新名称?

    假设我有一个AFTER ALTER在我的 Oracle 数据库上触发并重命名一些数据库对象 ALTER RENAME TO 在触发器中 我如何确定new数据库对象的名称 看来ORA DICT OBJ OWNER ORA DICT OBJ N
  • 在 Oracle 行的多个列上使用透视

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

随机推荐

  • Python求和地理半径内的纬度/经度点并求和到网格

    基本上 我的实验程序试图找到给定时间落在有效点半径 例如 50 公里 内的点的数量 我的数据是结构化的 但如果需要的话我可以重组 在三个单独的数组中 例如 1 LAT 1 LON 1 TIM 其中 1 LAT 1 LON 1 TIM 均包含
  • 如何让窗体在按退出键时关闭?

    我有一个小窗体 当我按下 Windows 窗体应用程序中的按钮时会出现该窗体 我希望能够通过按退出键关闭表单 我怎么能这样做呢 我不确定要使用的事件 形式 关闭 如果表单上已有关闭表单的按钮 则可以在表单上设置一个属性来为您执行此操作 Se
  • 如何从视觉工作室外部打开WorkItem(VS-Team Explorer)?

    我想使用 C 代码从 Visual Studio 外部打开工作项 是否可以 我尝试过这个 IWorkItemDocument widoc null try string tfsName http rd tfs no2 8080 tfs si
  • .NET 中的 Getter 和 Setter 声明[重复]

    这个问题在这里已经有答案了 我想知道 getter 和 setter 的声明之间有什么区别 以及是否有首选方法 以及原因 第一个可以由 Visual Studio 自动生成 其他人呢 谢谢 1st string myProperty get
  • Java 中接口的重要性[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 假设我们有两个班级 Tiger an
  • Windows Remote 上 OpenGL 的现状和解决方案 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 OpenGL 和 Windows Remote 不能很好地配合 此问题的解决方案取决于用例 并且答案分散在网络的各个角落 当我开始研究这个
  • 在 Crystal Reports 中将行数据转置为列

    我从存储过程返回以下数据 Staff Category Amount Bob Art 123 Bob Sport 777 Bob Music 342 Jeff Art 0 Jeff Sport 11 Jeff Music 27 即使金额为零
  • Mac OS X:从目录服务获取当前用户的当前用户名和主目录

    我的应用程序是用 Objective C 编写的 如何通过目录服务获取当前登录用户的用户名和主目录 细节 我的 Cocoa 应用程序使用 getenv USER getenv HOME 获取当前用户名和主目录 显然 如果用户通过目录服务登录
  • leafletjs 添加可滚动弹出窗口?

    使用带有弹出窗口的 leafletjs 当我的弹出窗口包含最少的文本时 一切正常 如果我把它们做得更大 它们仍然可以正常工作 如果我添加太多 我会添加 maxHeight 到弹出窗口 它使弹出窗口可滚动 如果我一开始没有足够的内容来填充页面
  • 如何在 MediaPlayer setDataSource 中包含 http 标头?

    我正在将 URI 传递给设置数据源方法 http developer android com reference android media MediaPlayer html setDataSource 28java lang String
  • 使用动态发出的 POCO 进行快速序列化和反序列化

    我目前正在将 SQL 表行序列化为二进制格式 以实现高效存储 我将二进制数据序列化 反序列化为List每行 我正在尝试升级它以使用 POCO 它将动态生成 发出 每列一个字段 我在网上搜索了几个小时 偶然发现了像 EF T4 Expando
  • 如何替换字符串中的最后一个单词

    有谁知道如何替换字符串中的最后一个单词 目前我正在做 someStr someStr replace someStr substring someStr lastIndexOf 1 New Word 上面的代码替换了字符串中出现的每个单词
  • 如何使用 Flexbox 实现浮动侧边栏布局,内容环绕侧边栏?

    我正在尝试实现在桌面上看起来像这样的响应式布局 在手机上就像这样 请注意以下要求 侧边栏应仅占据适合内容所需的垂直空间 在侧边栏下方 主要部分的内容应占据整个宽度 在移动设备上 侧边栏应显示在主要内容下方 这是一个包含我最初的 HTML 和
  • 使用装饰器自动注册类方法

    我希望能够创建一个 python 装饰器 自动在全局存储库中 注册 类方法 带有一些属性 示例代码 class my class object register prop1 prop2 def my method arg1 arg2 met
  • HTML5 视频 MEDIA_ERR_DECODE 随机发生

    我正在开发一个包含 6 个音频和视频元素的项目 这些元素依次播放 发出前的代码顺序是这样的 预加载所有媒体资源直到 canplaythrough 播放视频 1 停止 video 1 并播放 audio 1 停止音频 1 并再次播放视频 1
  • 使用 sed/awk 替换文本文件的部分

    我正在尝试替换文件中 begin 和 end 之间的文本 如下所示 begin block param1 param2 end 读作 begin block param1 value1 param2 value2 end 基本上 我取消注释
  • 从 JDialog 返回值; dispose()、setVisible(false) - 示例

    我知道 这个问题在 SO 中经常出现 比如here https stackoverflow com questions 4089311 how can i return a value from a jdialog box to the p
  • 如何在 rechart 中将工具提示放置在条形图的顶部?

    Problem 我创建了一个带有自定义工具提示的条形图 现在我需要的是将工具提示放置在栏的顶部而不是图表区域内 就像这张照片一样 这就是现在的样子 在这里我提供了我如何组织我的代码 import React Component from r
  • 如何将一个计算列的每一行除以另一个计算列的总和?

    我无法使用此示例数据得到正确的除法 Calculated column Another calc column 48 207 257 370 518 138 489 354 837 478 1 005 648 1 021 2 060 1 4
  • 如何获得 COUNT(column) ... GROUP BY 来使用索引?

    我有一个表 col1 col2 其索引为 col1 col2 该表中有数百万行 我想运行一个查询 SELECT col1 COUNT col2 WHERE col1 NOT IN