Oracle SQL-最有效的实现方式是记录读取?

时间:2018-07-28 09:45:48

标签: sql oracle performance plsql oracle12c

我们的应用程序中有一个功能,可以从表中查询用户需要查看的所有通知。基本上,它有点像电子邮件在网站上的显示方式。右上角有一个图标,显示有关您有多少个新通知的警报,单击该图标会列出您有的所有通知,将已读和未读通知分开。

我们从一个表中查询所有通知。困境是我们如何将标记记录实现为未读或已读。最初的计划是为每个记录添加一个标志,以指示是否已读取。因此,我们进行查询,遍历结果集,并将所有那些为“ N”的记录的读取标志设置为“ Y”。从性能角度来看,遍历结果集中的每个记录并更新读取标志似乎有些错误。有一个更好的方法吗? oracle db中是否有功能可以解决此问题?不能在前端处理

我们正在使用Oracle 12c

2 个答案:

答案 0 :(得分:1)

如果您担心效果,应该不要循环显示结果集,如果可以避免的话。 SQL是一种基于集合的语言,因此可以对集合(而不是记录)进行操作。认真地,去读史蒂芬·费尔斯坦。您没有给我们任何桌子或任何东西,但是您想要做类似的事情:

UPDATE mytable
   SET read_flag = 'Y'
 WHERE read_flag = 'N'
   AND ...

这将更新所有未读内容以一次读取。如果您需要知道有多少更新,Oracle在运行后可以立即查看SQL%ROWCOUNT

但是,在您不得不担心性能之前,请不要担心性能。如果没有证据,不要以为这将是一个性能问题。老实说,对于我想像的这张表来说,将几行标记为已读不会成为性能问题。

答案 1 :(得分:0)

您可以按照此处所述-https://oracle-base.com/articles/misc/dml-returning-into-clause#collections

链接的修改示例:

DECLARE
  TYPE t_tab IS TABLE OF t1.notification_text%TYPE;
  l_tab t_tab;
BEGIN
  UPDATE my_table
  SET is_read = 'Y'
  RETURNING notification_text BULK COLLECT INTO l_tab;

  -- Do stuff with the data in your collection. Return it or whatever.
END;
/