(关系)日期/时间点/间隔的数据库性能

IMA*_*IMA 8 sql performance ms-access

所以我在Access SQL中做了一个项目,它很顺利.我学到了很多关于Access和VBA的知识,这个网站在这个过程中很有帮助.

现在我遇到了一个性能问题,因为我对这种SQL工作没有什么经验,所以我来这里是为了一些想法.

我有一个约20个表关系数据库,用于表示路径的大约100个部分.Access数据库本质上是一个地图,我在其上绘制了几条可以动态着色的路线(通过线路) - 颜色由特定问题确定并从数据库中计算出来.

这是一张更好地解释它的图片.您无法单击访问中的行,因此按钮的颜色和宽度设置为与行相同,并且可单击以获取更多信息. 一个东西

用户可以选择日期,并根据询问的问题显示路线的进度.到目前为止,这些问题总是二进制"是或否"(绿色或红色).

我发现由于查询的复杂性,我必须在启动时为每个查询准备一个临时数据库,否则无法顺利滚动日期.

所以无论如何这是我的具体问题:

路线的每个部分可以在特定日期处于不同阶段(思考构造).从"阶段0"到"完成"

将实施一个代表项目阶段的新生产线.所有部分都有大约8个可能的阶段,这可能发生在不同的时间 - 这就是事情 - 每个部分的顺序不同而且并非所有阶段都发生.

我在数据库中只有每个阶段的开始日期 - 而不是结束日期.阶段的顺序几乎取决于开始日期的顺序.每个部分至少每个阶段只能发生一次,所以就是这样.正如你所看到的,对于这种以性能为中心的程序来说,这是一件很糟糕的事情.

我确信它将涉及一个或几个临时数据库.我的想法:

  1. 将所有日期聚合到新表的一行中.由于设置了相数,因此每个阶段都有列 - 如果需要,何时开始以及何时结束.循环现在需要遍历每个循环并检查用户日期是否属于哪个阶段.所以:"SectionID - phase1needed phase1start phase1end ....."
    优势:

    • 可以手动确认数据并以次要形式显示
    • 它保持数据库小的
      缺点:
    • 实际循环需要通过(最差)所有阶段才能找到正确的循环.
  2. 计算一个新的数据库,它只是"IdSection - Date - Phase",并计算一个区间内每个Section和EVERY日的阶段.
    优点:

    • 这使运行时计算保持每个部分一个查询
    • 访问应该处理大量数据
      缺点:
    • 我不能手动检查我所做的是否对所有部分都正确
    • 在启动时需要很长时间,就像真的很长
    • 这个db需要很多条目

现在我问你想要哪个,或者即使有不同的方法?我无法真正改变我的数据点.

总之,我必须显示不同阶段的时间间隔,在数据库中我只有时间的起点,没有完整的阶段顺序.

感谢您的想法,任何有关这些事情的经验都会有所帮助

小智 1

如果我理解正确的话,你会得到一系列类似于以下形式的数据:

Section 1, Phase 7, Start Date = 11/07/2012
Section 1, Phase 2, Start Date = 12/14/2012
Section 1, Phase 3, Start Date = 12/28/2012
Section 2, Phase 1, Start Date = 11/04/2012
Section 2, Phase 9, Start Date = 12/30/2012
Section 3, Phase 4, Start Date = 11/19/2012
Section 3, Phase 5, Start Date = 12/06/2012
Section 3, Phase 3, Start Date = 12/11/2012
Run Code Online (Sandbox Code Playgroud)

您想回答“2012 年 12 月 15 日每个部分处于哪个阶段?”这样的问题,对吗?

这种情况下的答案应该类似于以下形式:

Section 1, Phase 2
Section 2, Phase 1
Section 3, Phase 3
Run Code Online (Sandbox Code Playgroud)

为了做到这一点,我假设您有一个名为 SECTION_PHASES 的表,其中包含以下字段:

SECTION    Number
PHASE      Number
START_DATE Date/Time
Run Code Online (Sandbox Code Playgroud)

您需要做的是找出当前输入日期之前发生的每个部分的最大开始日期,因为这是下一个阶段更改之前的最近活动阶段。完成此操作后,您可以将该信息连接回主表中,以确定该日期之后的阶段。

您需要进行一个查询 SECTION_MAX_DATES,然后在其 SQL 视图中包含以下代码:

SELECT [SECTION_PHASES].SECTION, Max([SECTION_PHASES].START_DATE) AS target_date
FROM SECTION_PHASES
WHERE [SECTION_PHASES].START_DATE<#12/15/2012#
GROUP BY [SECTION_PHASES].SECTION
ORDER BY [SECTION_PHASES].SECTION;
Run Code Online (Sandbox Code Playgroud)

保存该查询后,您可以将其作为子查询连接回原始表。现在,创建另一个查询 SECTION_PHASE_AT_DATE,其中包括原始表和上一个查询,然后在其 SQL 视图中输入以下代码:

SELECT SECTION_PHASES.SECTION, SECTION_PHASES.PHASE, SECTION_PHASES.START_DATE
FROM SECTION_MAX_DATES INNER JOIN SECTION_PHASES ON (SECTION_MAX_DATES.target_date=SECTION_PHASES.START_DATE) AND (SECTION_MAX_DATES.SECTION=SECTION_PHASES.SECTION)
ORDER BY SECTION_PHASES.SECTION;
Run Code Online (Sandbox Code Playgroud)

如果我正确理解你的问题,该查询将为你提供你想要的结果。如果我正确理解您的意思,即给定阶段的新开始日期表示新日期之前的任何阶段的结束,则无需计算结束日期。

您仍然需要解决一些边缘情况,例如如果某个部分在给定日期之前尚未注册阶段会发生什么情况。我还将让您弄清楚如何参数化两个查询中第一个查询的 WHERE 子句中的日期,考虑到您已经取得的进展,这对您来说可能是微不足道的!但是,我认为这是您正在寻找的用于解决问题的数据/计算部分的 SQL 结构。