PL/SQL:我应该使用集合还是执行多个查询?

PL/SQL:我应该使用集合还是执行多个查询?,sql,performance,oracle,collections,plsql,Sql,Performance,Oracle,Collections,Plsql,我正在做这个项目,我需要创建一个大的HTML表,其中每个表行的间隔为15分钟,每个表列的间隔为一天。目标是向想要预订房间的用户显示房间是否可用。所有网页都是PL/SQL包,可以打印出正确的HTML 特定房间的桌子示例: 别介意不同的颜色 所有房间定义都存储在一个oracle数据库中,该数据库包含一周的开始日期、结束日期、开始时间、结束时间和天数。例如,定义可以是:07-31-2013-07-31-2014,00:00-23:59,周一、周二和周五 我关心的是,要构建html表的每个方块,我需要进

我正在做这个项目,我需要创建一个大的HTML表,其中每个表行的间隔为15分钟,每个表列的间隔为一天。目标是向想要预订房间的用户显示房间是否可用。所有网页都是PL/SQL包,可以打印出正确的HTML

特定房间的桌子示例:

别介意不同的颜色

所有房间定义都存储在一个oracle数据库中,该数据库包含一周的开始日期、结束日期、开始时间、结束时间和天数。例如,定义可以是:07-31-2013-07-31-2014,00:00-23:59,周一、周二和周五

我关心的是,要构建html表的每个方块,我需要进行查询以检查是否定义了特定的时段。例如,如果用户希望查看一个房间从10:00到14:00的一整周,将进行112次查询,以15分钟为间隔构建表,更不用说用户最多可以查看4周,并且从任何时间间隔都可以从00:00到23:59。另一个问题是,我需要检查房间的定义,但我还必须检查多次,以确定该间隔是否由预订占用。。。因此,这使得224个查询只看到一个星期

我的解决方案是获取所有可能影响用户希望查看的时间段的房间定义和预订,并将它们放入集合1用于定义,1用于预订。之后,我在这些集合上运行所有测试,而不进行查询。我的主过程调用一个函数,将两个集合作为参数发送,该函数返回true或false

我想知道oracle是否能够处理这么多小的请求,或者我是否对集合做了正确的处理

我读过很多帖子,说集合对内存有害,我担心通过函数参数传递集合也会无济于事。。。虽然这可能不适用于我的情况,但考虑到收藏中可能永远不会有超过1-5条记录

我要检查它是否可用的查询如下:

SELECT DISTINCT 'Y' 
FROM room_defenition
WHERE
START_DATE <= USER_DATE AND 
END_DATE >= USER_DATE AND
--F_TO_DAY converts the date to the coresponding code
REGEXP_INSTR(MON||TUE||WED||THU||FRI||SAT||SUN,F_TO_DAY(USER_DATE)) <> 0 AND
START_TIME <= USER_START_TIME AND 
END_TIME >= USER_END_TIME;
USER_DATE将是我正在测试的当前列,USER_START_TIME和USER_END_TIME将是当前间隔的两个边界。示例07-31-2013-10:00-10:15


我在where子句中还有两个子查询,用于检查是否允许用户在此房间上进行预订…

执行此类操作的一个解决方案是创建称为维度的表。您的数组有两个维度,因此您可以创建两个表,例如一个称为Quarter的表,一天中每15分钟有一行,因此有96行

id    timestart   timeend
-----------------
1      00:00  00:15
2      00:15  00:30
...
还有一种叫做日历的日历,它可以保存全年或未来10年的天数,这并不重要

id    dateofday
---------------
1     01/01/2013
2     02/01/2013
...
无论是否有可用的房间,都可以轻松构建一个查询,为数组中的每个单元格提供一行

select timestart, timeend, dateofday
from quarters cross join calendar -- a legitimate use for cross join
where timestart >= user_time_start and
      timeend   <= user_time_end and
      dateofday between user_date_start and user_date_end 
order by quarters.id, calendar.id
结果按数组的行排序,然后按列排序。因此,您可以一次读取一行查询结果,并动态构建数组,无需收集或复杂的算法

现在,您只需添加一个子查询,告诉您房间是否可用,例如:

select timestart, timeend, dateofday,
    (*subquery on room_definition *) available
    from quarters cross join calendar -- a legitimate use for cross join
    where timestart >= user_time_start and
          timeend   <= user_time_end and
          dateofday between user_date_start and user_date_end 
    order by quarters.id, calendar.id

我在这里帮不上什么忙,但是你的查询是什么样子的?补充说如果我不使用集合,我的查询会是什么样的我想我理解你的概念,但在这种情况下,这不会破坏不进行一系列查询或子查询的目的吗?如果我错了,请纠正我的错误,但是对room_definition上的*子查询*进行计算的次数是否与我在HTML表中的正方形计算的次数相同?我真的不知道Oracle将如何运行子查询,您必须运行一个解释计划。但所有数据都将在Oracle中读取、准备和排序,这正是它构建的目的,而且做得非常好。另外,您还消除了准备查询、打开游标、读取结果、关闭游标等过程中的开销,…+1虽然我可能会考虑使用外部连接到room_定义,而不是select子句,但这取决于具体情况。