我现在感到愚蠢.
我必须在我无法直接访问的数据库上更新100.000行.该表的总行数大约为500.000行.更新只是为字段添加一个字符,以防它的长度<3.所以基本上:
UPDATE X SET VALUE ='0'|| VALUE WHERE LENGTH(VALUE)<3
所以我把这个更新发送给DBA,然后他们回复给我说这个语句有太多的性能成本(因为完整的访问表和100k提交)而且我应该写一个进程代替.然后他们为我提供了一个代码示例,以防我不知道如何制作一个代码示例.
我说WTF,一个进程如何比单个更新语句运行得更快?在做一些测试之后,我的更新需要30秒才能运行,按照他们的代码示例,该过程需要10分钟.
因此,真正的问题是,在所有这些挫败之后,是:在where子句中使用这样的函数时,有没有办法避免完整的访问表?(该列已编入索引)
您的陈述已经过优化.它基于集合并以最有效的方式查询表(全表扫描).您将无法编写以较少资源/时间执行相同工作的程序.你CAN写一个程序表现不佳,这是不重新启动的错误的情况下(即:每提交100行)和将垄断更多的资源.
跟随Tom Kyte的口头禅:
- 如果可能的话,您应该在单个SQL语句中执行此操作.
- 如果您无法在单个SQL语句中执行此操作,请在PL/SQL中执行此操作.
- 如果您无法在PL/SQL中执行此操作,请尝试Java存储过程.
- 如果您不能在Java中执行此操作,请在C外部过程中执行此操作.
- 如果您不能在C外部例程中执行此操作,您可能需要认真考虑为什么需要这样做
| 归档时间: |
|
| 查看次数: |
4516 次 |
| 最近记录: |