问题标签 [full-table-scan]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
463 浏览

sql-server - 在这种情况下如何避免 SQL Server 上的表扫描

有两个表,CostsLogs。表中的数据Costs可以是数百万行,Logs表中的数据可以是数十亿行。

我需要在每次运行 100 条记录内更新生产环境中服务任务的表中的CostBy列。Costs

这是原始更新声明:

但是,该语句引入了一个海量的性能问题,table scan in table 的成本很高Costs

我的问题是如何避免表中的表扫描Costs或如何优化更新语句?

提前致谢。

0 投票
1 回答
1004 浏览

oracle - oracle 12c 中使用缓存和无缓存的全表扫描行为

我在两个具有几乎相同配置的不同数据库服务器上运行相同的查询。查询正在对一张表进行全表扫描 (FTS)

SELECT COUNT (1) FROM tax_proposal_dtl WHERE tax_proposal_no = :b1 AND taxid != :b2 AND INSTR(:b3 , ',' || STATUS || ',' ) > 0 ;

在第一个 DB 上,我得到不到 3 秒的结果,磁盘读取为 0,而在第二个 DB 上,磁盘读取很高,经过的时间约为 9 秒

两个数据库上的表配置之间的唯一区别是,第一个表上的缓存 = 'Y',而第二个缓存 = 'N'。据我了解,在不使用 FTS 缓存的情况下,将使用直接路径读取。那么,为什么相同查询的性能会受到缓存/无缓存的影响(因为这是两个环境之间的唯一区别,甚至执行计划也是相同的)。

正如 Jon 所建议的那样,在对该主题进行了进一步研究之后(特别是关于 _SMALL_TABLE_THRESHOLD),我正在添加更多细节。

当前版本:Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit

第二个数据库的详细信息:

带有 _STT 的第二个 DB 的内存详细信息

来自 DBA_SEGMENTS 的表的总块数 = 196736

第一个数据库的详细信息:

带有 _STT 的第一个 DB 的内存详细信息

来自 DBA_SEGMENTS 的表的总块数 = 172288

两个数据库的执行计划相同,但有两个主要区别:a)第二个数据库缓存选项在表上为假(我尝试了更改表缓存但仍然对性能没有影响)

b) 在第 2 个 DB 上,因为 _STT 参数为 23920,因此根据 5*_STT 规则表将不被视为中型表,而在第 1 个 DB 上,_STT 参数为 48496,因此根据 5*_STT 规则表将被视为中型表。

下面是基于我迄今为止对 _STT 的研究的图表,它是一个 Cache 参数,用于说明系统在不同表大小下的行为方式。

描述表大小、缓存和 _STT 参数影响的图表

请让我知道我的理解是否正确,假设缓存选项对中型或大型表没有影响,但它有助于在 LRU 中保留更长时间的小型表。因此,基于上述假设和图表,我得出的结论是,在第 2 个 DB 表的情况下,它被归类为大型表,因此 DPR 和更多经过的时间,而在第 1 个数据库表的情况下,它被归类为中型表,因此缓存读取和经过的时间更少。

根据此链接,我已在第二个 DB 的会话中设置 _STT 参数

因此,性能得到了显着提高,几乎与第一个 0 磁盘读取的 DB 相同,因为这意味着表将被认为是小型的。

我在研究中使用了以下文章。

https://jonathanlewis.wordpress.com/2011/03/24/small-tables/

https://hoopercharles.wordpress.com/2010/06/17/_small_table_threshold-parameter-and-buffer-cache-what-is-wrong-with-this-quote/?unapproved=43522&moderation-hash=be8d35c5530411ff0ca96388a6fa8099#comment-43522

https://dioncho.wordpress.com/tag/full-table-scan/

https://mikesmithers.wordpress.com/2016/06/23/oracle-pinning-table-data-in-the-buffer-cache/

http://afatkulin.blogspot.com/2012/07/serial-direct-path-reads-in-11gr2-and.html

http://afatkulin.blogspot.com/2009/01/11g-adaptive-direct-path-reads-what-is.html

0 投票
1 回答
294 浏览

foreign-data-wrapper - 通过 oracle_fdw 从 Postgres 外部表中选择数据不使用 Oracle 端的索引

简而言之:我们面临一个问题,即在远程 Oracle DB 上执行全表扫描而不是使用索引。

设置:

Postgres 12.3 在带有 oracle 基本客户端的丰富 docker 容器中,连接到版本 19c 中的远程 Oracle DB。访问的表有 2M 个条目。安装的 oracle_fdw 是 2.30 版本。

问题:

似乎外部表上的选择没有使用外部表的索引。我们要根据本地表中的数据来选择外部表中的数据。我们尝试了不同的方法,例如连接或子选择,但未使用外表上的索引。我们尝试使用函数生成不可变数据,这确实有效。对于这个单一的 id,语句在 12 毫秒内返回,解释计划显示使用了索引。

但它实际上是行不通的,如果我们使用这里看到的函数返回多行:

在这种情况下,即使是一行,语句也需要大约 4 分钟才能返回。解释计划显示执行了全表扫描。

为什么不使用索引?我们可以做些什么来强制使用索引?

如果需要有关设置或表格的更多信息,我们将更新问题。


我们基本上追踪到了这个需求(WHERE 语句似乎没有被强制到 Oracle):

任何帮助表示赞赏。谢谢!

0 投票
1 回答
68 浏览

mysql - 堆与聚集索引全表扫描

我一直在为此来回搜索,但无法了解磁盘上的表数据块的结构。

许多资源表明进行全表扫描会顺序读取块(这意味着数据库能够一次读取多个块),但我找不到任何资源实际描述块在磁盘上的保存方式堆 VS 聚集索引的情况。

堆不决定顺序,这是因为数据库不关心它从磁盘读取的块的顺序,但是:

  1. 我仍然没有找到任何证据可以保证堆数据按顺序存储在磁盘上
  2. 使用聚集索引,结果的顺序确实很重要。在那种情况下,我无法理解数据库如何在保持顺序的同时保持顺序。顺序读取是否仍然适用于聚集索引?

任何描述在每种情况下如何在磁盘上布置块的资源都会有所帮助

0 投票
0 回答
102 浏览

java - 使用 Java SDK v2 从 dynamodb 扫描地图列表

我正在尝试扫描将地图列表作为属性值的 DynamoDB 表。

DynamoDB 表:

目标 Java 对象:

我收到以下错误:

我知道这种嵌套结构不支持 out-ob-box 所以我需要提供一个转换器来告诉它如何将 DynmaoDB 对象映射到我的 java 类。

我已经开始实现一个 StaticTableSchema 但是我不知道如何申请我的案例:

还有一些我可以实现的转换器接口,但是在这一点上我被卡住了。我使用的是 Java SDK v2,所以我通常会找到 v1 的示例,但它们仍然只适用于原始类型,而不是像我这样的复杂情况。

知道如何将我的 DynamoDB 属性值映射到我的 Java 对象吗?

谢谢

0 投票
1 回答
53 浏览

mysql - 如何避免mysql连接查询中的全表扫描

考虑以下查询:

需要避免全表扫描。

我的查询是这样的,

图 1 和图 2 描述了表格的类型、键和可能的键信息

有人可以指导我避免对这 6 个表进行全表扫描。

0 投票
1 回答
36 浏览

mysql - 如何避免在具有大输出的mysql查询中进行全表扫描

我有非常大的表(超过 1000 万行)和返回大量数据的查询。我需要让它跑得更快。所以我尝试添加覆盖索引(由 where 子句和 id 的值组成),但即使在索引提示 USE INDEX 之后仍然存在全表扫描。然后我在选择中剪切值(仅留下 id)并添加覆盖索引,但仍然存在全表扫描。如何避免全表扫描?我尝试为所有列创建覆盖索引并进行全索引扫描,但该解决方案比全表扫描更长。还有其他优化方法吗?我尝试了索引,尝试删除不存在(更改为 id not in),这一切都让时间变得更糟。我有 Table1.id、table1.UserId、Table2.Id 的索引。