如何创建慢速SQL查询?

aba*_*one 4 sql oracle database-performance

我有一个百万行表,Oracle 11g Express并希望运行一个缓慢的SQL选择查询,以便我可以以各种方式测试停止代理并观察数据库服务器上的结果.

但无论我做什么,比如自联接非索引列,使用dbms_random选择随机行,其中/ order by语句使用非索引列,结果都在几秒钟内完成.

我可以编写一个查询,这需要几分钟吗?

Jus*_*ave 9

在这种情况下,我不太清楚"停止代理"是什么意思.唯一的"代理"我在这方面可以想到的将是一个企业管理代理,但我怀疑这是你在说什么,我不明白你为什么会需要一个长时间运行的查询.

强制查询长时间运行的最简单方法是使用该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你定义的任何表空间.