【发布时间】:2017-08-03 03:00:55
【问题描述】:
我们正在尝试从 oracle 数据库中提取数据,但性能似乎非常低。
我们有一个大约 1000 万行的表,我们有一个索引,我们通过该索引提取大约 1.3k 行 {select * from tab where indexed_field = 'value'}(简化形式)。
SQuirreL 报告查询“执行:0.182 秒,构建输出:28.921 秒”。返回的数据占用大约 340kB(例如,当复制/粘贴到文本文件时)。
有时构建输出阶段需要更长的时间(>5 分钟),尤其是第一次运行查询时。重复它似乎运行得更快 - 例如上面的 29s 值。这可能只是数据库暂时过载的结果,还是因为缓冲重复数据?
每 50 行 (13kB) 的秒数是合理的数字,还是出乎意料的大? (这不太可能是网络问题。)
如果 dbms 未能利用数据可以物理分组(通过使物理顺序与索引顺序相同)并且每行执行单独的磁盘读取这一事实,dbms 是否有可能,如果是这样,如何它被说服更有效率?
数据没有什么奇怪的——每行 22 列,虽然通常包含几十个字符,但大多定义为 varchar2(250)。我不确定运行 Oracle 的铁件有多大,但它存在于数据中心中,所以可能不会太微不足道。
感谢您的任何想法。
【问题讨论】:
-
您是否尝试过将获取大小设置得更大,例如 500 左右?我认为对于 SQuirreL,它位于 File -> New Session properties -> General 之类的地方。在另一个故障排除说明中,如果您不选择任何列,查询速度会如何?例如
select 1 from tab where indexed_field = 'value' -
性能调优关乎细节——数据量和偏斜、分布、索引、统计等。这个问题太笼统了,无法回答。
标签: oracle