Sql ROWID用于筛选列的伪列: CREATE OR REPLACE PROCEDURE DEL_OBS( cuantos number ) IS BEGIN DELETE FROM OBSERVATIONS WHERE ROWID IN ( SELECT rid FROM ( SELECT ROWID AS rid FROM observations ORDER BY DBMS_RANDOM.VALUE ) WHERE ROWNUM < cuantos ); END del_obs;
使用索引查询3:Sql ROWID用于筛选列的伪列: CREATE OR REPLACE PROCEDURE DEL_OBS( cuantos number ) IS BEGIN DELETE FROM OBSERVATIONS WHERE ROWID IN ( SELECT rid FROM ( SELECT ROWID AS rid FROM observations ORDER BY DBMS_RANDOM.VALUE ) WHERE ROWNUM < cuantos ); END del_obs;,sql,oracle,query-optimization,Sql,Oracle,Query Optimization,使用索引查询3: DELETE FROM table_name WHERE ROWID IN ( SELECT rid FROM ( SELECT ROWID AS rid FROM table_name ORDER BY DBMS_RANDOM.VALUE ) WHERE ROWNUM <= 10000 ) 问题是,你想做什么?为什么要删除记录的随机子集?@APC这不是我的代码,我只是想改进它的执行优化意味着更高效地产生相同的结果。当我们
DELETE FROM table_name
WHERE ROWID IN (
SELECT rid
FROM (
SELECT ROWID AS rid
FROM table_name
ORDER BY DBMS_RANDOM.VALUE
)
WHERE ROWNUM <= 10000
)
问题是,你想做什么?为什么要删除记录的随机子集?@APC这不是我的代码,我只是想改进它的执行优化意味着更高效地产生相同的结果。当我们不理解原始代码应该做什么时,IP很难做到这一点。代码本身就很慢。如果您无法重写它,则无法使其更快(因为访问路径是主键)。因此,您需要回到为您设置此任务的人那里,并解释不重写代码就不可能提高代码的性能。数据库是引擎,更像是机械设备,而不是一袋魔豆。唯一的其他选择是:(1)先删除大部分数据,这样剩余的数据集会更小,随机排序会更快,(2)向服务器添加更多的RAM,并增加缓冲池以容纳整个表,无论它有多大,(3)升级到更强大的服务器,具有更高的CPU和I/O性能。问题是,你想做什么?为什么要删除记录的随机子集?@APC这不是我的代码,我只是想改进它的执行优化意味着更高效地产生相同的结果。当我们不理解原始代码应该做什么时,IP很难做到这一点。代码本身就很慢。如果您无法重写它,则无法使其更快(因为访问路径是主键)。因此,您需要回到为您设置此任务的人那里,并解释不重写代码就不可能提高代码的性能。数据库是引擎,更像是机械设备,而不是一袋魔豆。唯一的其他选择是:(1)先删除大部分数据,这样剩余的数据集会更小,随机排序会更快,(2)向服务器添加更多的RAM,并增加缓冲池以容纳整个表,无论它有多大,(3)升级到更强大的服务器,具有更高的CPU和I/O性能。感谢您的提示,但我无法更改查询,这是一个给定的代码,我们不允许接触。我们只能添加外部改进,使用索引或更改PCTFREE和PCTUSED…感谢您的提示,但我无法更改查询,这是我们不允许接触的给定代码。我们只能添加外部改进,使用索引或更改PCTFREE和PCTUSED…感谢您的帮助,但我无法更改代码,只能在事后进行改进:感谢您的帮助,但我无法更改代码,只能在事后进行改进:我会尝试,但到目前为止,我不明白该索引有何帮助,如果该索引是由DBMS创建的(nplate和odatetime是观察的PK,很抱歉我没有这么说),那么该索引已经存在了。您可以通过显示表的DDL脚本轻松地验证这一点。我会尝试一下,但现在我不明白该索引有什么帮助,如果该索引是由DBMS创建的(nplate和odatetime是观察结果的PK,很抱歉我没有这么说),那么该索引已经存在。您可以通过显示表的DDL脚本轻松验证这一点。
CREATE INDEX cuantos ON OBSERVATIONS(nplate, odatetime);
CREATE OR REPLACE PROCEDURE DEL_OBS(cuantos number) IS
begin
DELETE OBSERVATIONS FROM OBSERVATIONS
join (select * from OBSERVATIONS ORDER BY VALUE ) as i on
nplate=i.nplate AND
odatetime=i.odatetime AND
i.ROWNUM<=cuantos;
End DEL_OBS;
SELECT * FROM (
SELECT *
FROM observations
ORDER BY DBMS_RANDOM.VALUE)
WHERE ROWNUM<=cuantos;
AND rowid IN
( SELECT obs_sample.rowid
FROM observations sample (0.05) obs_sample)
FROM observations
FROM observations SAMPLE (0.05)
CREATE OR REPLACE PROCEDURE DEL_OBS(
cuantos number
)
IS
BEGIN
DELETE FROM OBSERVATIONS
WHERE ROWID IN (
SELECT rid
FROM (
SELECT ROWID AS rid
FROM observations
ORDER BY DBMS_RANDOM.VALUE
)
WHERE ROWNUM < cuantos
);
END del_obs;
CREATE TABLE table_name ( id ) AS
SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 50000;
DELETE FROM table_name
WHERE ROWID IN (
SELECT rid
FROM (
SELECT ROWID AS rid
FROM table_name
ORDER BY DBMS_RANDOM.VALUE
)
WHERE ROWNUM <= 10000
)
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | Time |
----------------------------------------------------------------------------------------
| 0 | DELETE STATEMENT | | 1 | 24 | 123 | 00:00:02 |
| 1 | DELETE | TABLE_NAME | | | | |
| 2 | NESTED LOOPS | | 1 | 24 | 123 | 00:00:02 |
| 3 | VIEW | VW_NSO_1 | 10000 | 120000 | 121 | 00:00:02 |
| 4 | SORT UNIQUE | | 1 | 120000 | | |
| * 5 | COUNT STOPKEY | | | | | |
| 6 | VIEW | | 19974 | 239688 | 121 | 00:00:02 |
| * 7 | SORT ORDER BY STOPKEY | | 19974 | 239688 | 121 | 00:00:02 |
| 8 | TABLE ACCESS FULL | TABLE_NAME | 19974 | 239688 | 25 | 00:00:01 |
| 9 | TABLE ACCESS BY USER ROWID | TABLE_NAME | 1 | 12 | 1 | 00:00:01 |
----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
------------------------------------------
* 5 - filter(ROWNUM<=10000)
* 7 - filter(ROWNUM<=10000)
ALTER TABLE table_name ADD CONSTRAINT tn__id__pk PRIMARY KEY ( id )
DELETE FROM table_name
WHERE ROWID IN (
SELECT rid
FROM (
SELECT ROWID AS rid
FROM table_name
ORDER BY DBMS_RANDOM.VALUE
)
WHERE ROWNUM <= 10000
)
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | Time |
---------------------------------------------------------------------------------------
| 0 | DELETE STATEMENT | | 1 | 37 | 13 | 00:00:01 |
| 1 | DELETE | TABLE_NAME | | | | |
| 2 | NESTED LOOPS | | 1 | 37 | 13 | 00:00:01 |
| 3 | VIEW | VW_NSO_1 | 9968 | 119616 | 11 | 00:00:01 |
| 4 | SORT UNIQUE | | 1 | 119616 | | |
| * 5 | COUNT STOPKEY | | | | | |
| 6 | VIEW | | 9968 | 119616 | 11 | 00:00:01 |
| * 7 | SORT ORDER BY STOPKEY | | 9968 | 119616 | 11 | 00:00:01 |
| 8 | INDEX FAST FULL SCAN | TN__ID__PK | 9968 | 119616 | 9 | 00:00:01 |
| 9 | TABLE ACCESS BY USER ROWID | TABLE_NAME | 1 | 25 | 1 | 00:00:01 |
---------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
------------------------------------------
* 5 - filter(ROWNUM<=10000)
* 7 - filter(ROWNUM<=10000)
CREATE OR REPLACE PROCEDURE DEL_OBS(cuantos number)
IS
TYPE obs_tab IS TABLE OF observations%ROWTYPE;
begin
SELECT *
BULK COLLECT INTO obs_tab
FROM (
SELECT * FROM observations ORDER BY DBMS_RANDOM.VALUE
)
WHERE ROWNUM<=cuantos;
FORALL i IN 1 .. obs_tab.COUNT
DELETE FROM OBSERVATIONS
WHERE nplate = obs_tab(i).nplate
AND odatetime = obs_tab(i).odatetime;
END del_obs;