【问题标题】:Why cannot a user run two or more select queries concurrently on same table?为什么用户不能在同一张表上同时运行两个或多个选择查询?
【发布时间】:2020-01-09 00:25:52
【问题描述】:

在使用 Oracle 数据库练习 DBMS 和 SQL 时,当我尝试在一个表上触发 2 个选择查询时,数据库总是等待第一个查询完成执行,并将另一个查询保留在管道中。

假设一个表 MY_TABLE 有 100 万条记录,其中的“id”列包含记录的序列号。

现在我的查询是:-

查询 #1 - select * from MY_TABLE where id<500001; --I am fetching first 500,000 records here

查询 #2 - select * from MY_TABLE where id>500000; --I am fetching next 500,000 records here

由于这些是选择查询,它们必须在表上获取一个读锁,这是一个共享锁。那么为什么会出现这种现象呢?请注意,据我所知,这两个查询的示例空间或域是互斥的,因为我通过 where 子句应用了过滤器,这进一步加剧了我的困惑。

另外,我以这种形式将其可视化,必须有一些进程正在评估我的查询,然后与内存(即资源)握手以获取结果。因此,所有持有该锁的进程都应该可以访问处于共享锁模式的任何资源。

其次,有没有办法覆盖这种行为或同时执行多个选择查询。

注意:- 我想将特定任务(即表的数据)分块并提高脚本的速度。

【问题讨论】:

  • 你是如何运行查询的?命令行还是一些 GUI 工具?
  • 您的推理不正确 - 对 两个不同的表 重复相同的操作,您将观察到相同的行为。 每个会话您只能有一个正在运行的查询。简单设置更多会话
  • @Shiva 我正在通过 SQL Developer (Oracle) 运行这些查询
  • @MarmiteBomber 是的,你是对的,对不起,我错过了检查。但是请指导,在这种情况下,我们是否应该被允许并行运行多个查询,因为它们的执行是相互独立的。是否有任何您觉得我在这里遗漏的 DBMS(DB 管理系统)或 ANSI-SQL 概念。我知道 ACID 部分,但从不同工作表运行查询是否也算作同一事务?
  • 问题在于您使用客户端(SQL Developer)的方式。在这里查看答案 - stackoverflow.com/questions/3237894/…

标签: sql oracle acid ansi-sql database-management


【解决方案1】:

数据库不会将查询保存在管道中,这只是您的客户端一次只发送一个查询的事实。数据库会很高兴地同时针对相同的数据运行多个查询,例如来自不同的会话。

【讨论】:

  • @Jefferey 这意味着它是客户端应用程序,它正在执行批处理,即使我也尝试使用不同的 SQL 工作表。我们是否可以按照 DBMS(数据库管理系统)原则以某种方式克服这个限制,这种预期操作是合法的。
  • @SharadNanda - 您的不同工作表是否共享相同的连接/会话? (请参阅工具->首选项->数据库->工作表->新工作表以使用非共享连接)
  • @AlexPoole 非常感谢!是的,现在我可以并行查询了。
猜你喜欢
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2012-11-05
  • 1970-01-01
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多