我们正试图从oracle数据库中提取数据,但似乎性能非常低。
我们有一个大约10M行的表格,我们有一个索引,通过它我们可以拉动1.3k行{select * from tab where indexed_field ='value'}(以简化形式)。
SQuirreL报告查询采取“执行:0.182s,构建输出:28.921s”。返回的数据占用340kB(例如,复制/粘贴到文本文件中时)。
有时,建筑物输出阶段需要更长时间(> 5分钟),尤其是第一次运行查询时。重复它似乎运行得更快 - 例如29s值超过。这可能只是数据库暂时过载的结果,可能是因为缓冲了重复数据吗?
每50行(13kB)是第二个合理数字还是这个意外大? (这不太可能是网络问题。)
dbms是否有可能无法利用数据可以物理分组的事实(通过使物理顺序与索引顺序相同)并且每行执行单独的磁盘读取,如果是这样,怎么能它被说服更有效率?
数据并不奇怪 - 每行22列,大多数定义为varchar2(250),但通常包含几十个字符。我不确定运行Oracle的铁器有多大,但是它存在于数据中心,所以可能不会太过分。
感激地收到任何想法。
答案 0 :(得分:1)
kfinity>您是否尝试过将抓取尺寸设置得更大,比如500左右?
那是那个!加速一个数量级。 2.5s中1.3k行,19s中9.5k行。谢谢你的建议。
顺便说一下,选择1只能提供大约10%的加速,我想这表明磁盘访问不是瓶颈。其他> 获取计划是:
Operation Options Object Mode Cost Bytes Cardinality
0 SELECT STATEMENT ALL_ROWS 6 17544 86
1 TABLE ACCESS BY INDEX ROWID BATCHED TAB ANALYZED 6 17544 86
2 INDEX RANGE SCAN TAB_IDX ANALYZED 3 86
,由于我的理解有限,看起来还不错。
“sho参数”的东西不起作用(SQL错误),除了给出的选择:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
PL/SQL Release 12.1.0.2.0 - Production
CORE 12.1.0.2.0 Production
TNS for Linux: Version 12.1.0.2.0 - Production
NLSRTL Version 12.1.0.2.0 - Production
我想唯一突出的问题是“将获取大小设置为较大值的缺点是什么?”。鉴于我们将总是最终读取整个结果集(除非有例外),我的猜测将“不多”。是吗?
无论如何,非常感谢那些回应并非常感谢解决方案的人。
答案 1 :(得分:0)
第二个结果比第一个结果快的原因是oracle在fisrt查询中加载RAM中的数据并且只在第二个结果中从RAM读取它。
你确定索引使用得很好吗?也许你可以做一个解释计划并向我们展示结果?
答案 2 :(得分:-1)
立即采取的行动很少:
执行以下操作,然后重新运行查询以提取执行计划。
SQL> set autotrace traceonly enable;
通过以下方式关闭此功能:
sql> set autotrace off ;
另外,提供以下结果:
sql> sho parameter SGA
sql> sho parameter cursor
sql> select banner from v$version;