Ian*_*ose 5 performance oracle database-design sql-server query-performance
假设我希望在员工休假 ( FromDate
, ToDate
)时进行存储,然后我希望找到在两个给定日期 ( QFromDate
, QToDate
)之间休假的所有员工。
现在假设我有很多这样的记录(超过服务器 RAM 的容量)并且需要经常执行此查询。
现在假设我还有sick_leave
表格、shift_pattern
表格、pay_rate
表格等——所有这些都具有FromDate
并ToDate
需要根据重叠日期将它们连接起来。
我应该如何存储日期范围以及如何编写查询以快速运行?
(RDBMS 的选择不是固定的,但能够在任何“标准”RDBMS 上运行是有价值的,除非这样做会产生很大的不利影响。)
我已经发布了一些我考虑过的答案,但不喜欢!然而,他们可能会帮助其他人。
例如,您可以生成一个自定义索引表,其中包含日期范围(某个假期等)包含的所有年份和星期对的行。然后您可以通过浏览该索引表来加入日期范围。它会很大,但确实避免了大扫描,因为您可以将与另一个假期有任何共同周的所有假期列为内部联接。
伪示例:
create table rangeindex (
vacation_id bigint,
year int,
week int,
primary key (year,week,vacation_id),
index (vacation_id))
select v2.*
from vacation v1
join rangeindex r1 on r1.vacation_id = v1.vacation_id
join rangeindex r2 on r2.year = r1.year and r2.week = r1.week
join vacation v2 on v2.vacation_id = r2.vacation_id
where v1.vacation_user = ?
-- and the usual start/end comparisons to filter unwanted pseudo hits
Run Code Online (Sandbox Code Playgroud)
类似的东西用于例如空间坐标的东西,将线性坐标划分为可以更容易地索引和扫描的网格单元。
更新:固定主键
生成一个日历表(可通过谷歌搜索)并将其他表加入其中。这使得以有效的方式轻松进行重叠等。
如果不清楚这是标准方式。我没有讨论示例用法,因为这里的答案太复杂了。搜索“日历表”将提供大量示例和完整的解释。
您不需要重新解决表扫描问题,因为对两个日期字段建立索引已经涵盖了该问题。
归档时间: |
|
查看次数: |
15357 次 |
最近记录: |