我要删除UserInfo表的第5行到第10行之间的数据
解决方案 »
- 關於批量insert 的速度問題,高手進........
- oracle10g(10.2.0.3.0)和9i的排序结果不同的问题
- 关于oracle的问题。本人菜鸟,请高手指点下。
- sql loader 导入多个文件(文件名有规则,但文件个数不定)
- Oracle 收费?
- 如何从oracle817数据库中提取所有的表的索引的脚本?
- 求一个SQL语句
- 请问oracle8.05能设置定时自动备份出.dmp文件吗?oracle9.2应该可以的吧.
- 新建用户连接OEM中数据库的问题.在线等,谢谢!急!
- oracle 服务器版可以打包到installsheld里面吗?
- 高分求助,Oracle Data Provider.net Oracle10g,在VS2010中如何安装使用
- oracle 怎样求得两个相除数的最简分数?
--默认排序的删除
delete UserInfo
where exists (select 1 from (select rownum rn,UserInfo.主键列 from UserInfo) t
where t.主键列=UserInfo.主键列 and t.rn between 5 and 10);--指定排序的删除
delete UserInfo
where exists (select 1 from (select row_number() over(order by 排序列) rn,UserInfo.主键列 from UserInfo) t
where t.主键列=UserInfo.主键列 and t.rn between 5 and 10);
只有记事本用,没法测,不知是否有错,自已测下,应没错,呵呵
where exists (select 1 from (select rownum rn,UserInfo.主键列 from UserInfo) t
where t.主键列=UserInfo.主键列 and t.rn between 5 and 10);
你试一下,看对不?
select *会去数据字典找metadata 但是select 1 却不会
二者,起码在执行计划上就有区别了。
下面用一个15万左右的表简单测试一下:23:42:53 hr@ORCL (^ω^) select 1 from test;已选择151359行。已用时间: 00: 00: 02.35
执行计划
----------------------------------------------------------
Plan hash value: 1357081020------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 151K| 473 (2)| 00:00:06 |
| 1 | TABLE ACCESS FULL| TEST | 151K| 473 (2)| 00:00:06 |
------------------------------------------------------------------
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
12046 consistent gets
0 physical reads
0 redo size
2038657 bytes sent via SQL*Net to client
111375 bytes received via SQL*Net from client
10092 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
151359 rows processed
23:45:00 hr@ORCL (^ω^) select * from test;已选择151359行。已用时间: 00: 00: 10.52
执行计划
----------------------------------------------------------
Plan hash value: 1357081020--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 151K| 13M| 479 (3)| 00:00:06 |
| 1 | TABLE ACCESS FULL| TEST | 151K| 13M| 479 (3)| 00:00:06 |
--------------------------------------------------------------------------
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
12046 consistent gets
0 physical reads
0 redo size
16255363 bytes sent via SQL*Net to client
111375 bytes received via SQL*Net from client
10092 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
151359 rows processed很明显:
1)从执行时间上:select 1 是2秒;select *是10秒
2)从cpu代价上:select 1 是473*2;而select *是479*2
3)从i/o开销上:select 1和select *上是一样的
当然了,这个测试只是小范围测试,数据量和测试数据不够多,但也可大体证明了我在上面提到的:select *会去查找数据字典,而select 1不会。
----------
1
1
1
1
1
1
1
1
1
1
1
1
1
1已选择14行。已用时间: 00: 00: 00.04
23:54:07 hr@ORCL (^ω^) select * from t1; EMPNO ENAME
---------- ----------------------------------------
7369 SMITH
7499 ALLEN
7654 MARTIN
7698 BLAKE
7782 CLARK
7839 KING
7876 ADAMS
7934 MILLER
7521 WARD
7566 JONES
7788 SCOTT
7844 TURNER
7900 JAMES
7902 FORD已选择14行。已用时间: 00: 00: 00.05这里的1只是个整数,全表扫描的代号而已。
23:54:16 hr@ORCL (^ω^) select 2 from t1; 2
----------
2
2
2
2
2
2
2
2
2
2
2
2
2
2已选择14行。已用时间: 00: 00: 00.01
表行的排序需要指定 order by。
rownum不能那样用,必须嵌套表。