从表中获取数据的困难

Posted

技术标签:

【中文标题】从表中获取数据的困难【英文标题】:difficulties to fetching data from table 【发布时间】:2019-10-09 09:37:58 【问题描述】:

我们有一个包含 627 列和大约 850 000 条记录的表。 我们正在尝试仅检索两列并将该数据转储到新表中,但是查询花费了无穷无尽的时间,我们无法在新表中获得结果。

create table test_sample
as
select roll_no, date_of_birth from sample_1;

我们在 roll_no 列 (varchar) 上有唯一索引,date_of_birth 的数据类型是日期。

【问题讨论】:

您没有提供任何 WHERE 子句,因此您从表中获取所有 85000 条记录。 请不要使用“十万”作为数字。在印度以外,这个词非常少见,使用千或百万。 这是一次性练习还是您需要定期进行的那种事情? 85 万 = 850,000。而且 625 列看起来很糟糕。 【参考方案1】:

您的查询没有 WHERE 子句,因此它会扫描整个表。它将每行的所有列读入内存以提取满足查询所需的列。这需要很长时间,因为您的表格有 627 列,我敢打赌其中一些列相当宽。

此外,具有这么多列的表可能会给您带来迁移行或链接的问题。其影响将取决于roll_nodate_of_birth 在表格投影中的相对位置。

简而言之,一个有 627 列的表显示出糟糕的(不存在的)数据建模。现在这对您没有帮助,这只是要吸取的教训。

如果这是一次性练习,您只需让查询运行即可。 (尽管您应该检查它是否正在运行:您能看到 V$SESSION_LONGOPS 中的活动进度吗?)

【讨论】:

我知道有些人的表也有大量列。当我问“为什么”时,他们说他们向甲骨文支付了高昂的费用。 Oracle 允许每个表有 1000 列。他们将使用其中的每一个。 (?!?) 尊敬的 APC,感谢您的回复。但您能否建议做同样事情的正确方法。因为创建了 627 列以维持 120 天的状态和其他一些事情。 @lobh - 抱歉,没有“正确的方法”。如果我处于你的位置,我可以想出各种我可能会尝试的事情,但很大程度上取决于基表和派生表的细节:数据分布、流失、偏斜;索引;目的和活动。此外,任何调优练习都必须从清楚地了解查询需要这么长时间的原因开始。它把时间花在哪里?请阅读this excellent answer 以了解您应该如何进行调查。

以上是关于从表中获取数据的困难的主要内容,如果未能解决你的问题,请参考以下文章

H2 数据库,从表中获取数据的问题

如何从表中逐块获取数据?

Jsoup:从表中获取数据

EF - 从表中获取数据给出空值

Rails:为循环的每次迭代从表中获取数据

MySQL:PHP:由于警告,无法从表中获取数据