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

时间:2012-12-21 07:47:40

标签: sql performance ms-access

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

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

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

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

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

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

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

路线的每个部分可以在特定日期处于不同阶段(思考施工)。从“阶段0”到“完成”

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

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

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

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

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

    • 这使运行时计算保持每个部分一个查询
    • 访问应该处理大量数据 缺点:
    • 我无法手动检查我所做的是否适用于所有部分
    • 在启动时需要很长时间,就像很长一段时间
    • 这个db
    • 需要很多条目
  3. 现在我问你想要哪个,或者即使有不同的方法? 我无法真正改变我的数据点。

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

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

1 个答案:

答案 0 :(得分: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

并且您想回答一个问题,例如“12/15/2012中每个部分的哪个阶段?”,这是正确的吗?

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

Section 1, Phase 2
Section 2, Phase 1
Section 3, Phase 3

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

SECTION    Number
PHASE      Number
START_DATE Date/Time

您需要做的是计算当前输入日期之前发生的每个部分的最长开始日期,因为这是下次阶段更改之前的最近活动阶段。完成后,您可以将该信息重新加入主表,以确定该日期之后的阶段。

您需要创建一个查询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;

保存该查询后,可以将其作为子查询加入原始表。现在,进行另一个查询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;

如果我正确理解您的问题,该查询将为您提供您所追求的结果。如果我理解你,某个特定阶段的新开始日期表明在新日期之前的当前阶段结束时,则无需计算结束日期。

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