aba*_*one 4 sql oracle database-performance
我有一个百万行表,Oracle 11g Express并希望运行一个缓慢的SQL选择查询,以便我可以以各种方式测试停止代理并观察数据库服务器上的结果.
但无论我做什么,比如自联接非索引列,使用dbms_random选择随机行,其中/ order by语句使用非索引列,结果都在几秒钟内完成.
我可以编写一个查询,这需要几分钟吗?
在这种情况下,我不太清楚"停止代理"是什么意思.唯一的"代理"我在这方面可以想到的将是一个企业管理代理,但我怀疑这是你在说什么,我不明白你为什么会需要一个长时间运行的查询.
强制查询长时间运行的最简单方法是使用该dbms_lock.sleep过程让它稍微休眠一下.就像是
CREATE OR REPLACE FUNCTION make_me_slow( p_seconds in number )
RETURN number
IS
BEGIN
dbms_lock.sleep( p_seconds );
RETURN 1;
END;
Run Code Online (Sandbox Code Playgroud)
您可以在查询中调用它
SELECT st.*, make_me_slow( 0.01 )
FROM some_table st
Run Code Online (Sandbox Code Playgroud)
这将为make_me_slow每一行调用一次some_table.每次通话make_me_slow至少需要0.01秒.如果some_table有10,000行,则需要至少100秒.如果它有100,000行,则需要1,000秒(16.67分钟).
如果您不关心查询的结果,则可以使用该dual表生成行,以便您不需要具有实现行的表.就像是
SELECT make_me_slow( 0.01 )
FROM dual
CONNECT BY level <= 20000
Run Code Online (Sandbox Code Playgroud)
将生成20,000行数据并至少需要200秒.
如果您想要一个纯SQL查询(这使您无法精确控制它将运行多长时间),
select count(*)
from million_row_table a
cross join million_row_table b
Run Code Online (Sandbox Code Playgroud)
将生成100万x 1百万= 1万亿行结果集.这可能会运行足够长的时间来吹灭TEMP你定义的任何表空间.