gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 04:18:37 25 4
gpt4 key购买 nike

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

现在我面临一个性能问题,由于我在这种 SQL 工作方面经验很少,所以我来这里思考一些想法。

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

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

用户可以选择一个日期,它会根据询问的问题显示路线的进度。到目前为止,这些问题始终是二元的“是或否”(绿色或红色)。

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

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

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

将实现一条新线,代表项目的各个阶段。所有部分大约有 8 个可能的阶段,这些阶段可能在不同时间发生,而且 - 事情是这样 - 每个部分以不同的顺序发生,并且并非所有阶段都发生在所有部分。

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

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

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

    • 可以手动确认数据并很好地以二次形式展示
    • 它使数据库保持较小的规模
      缺点:
    • 实际循环需要经历(最坏的情况)所有阶段才能找到正确的阶段。
  2. 计算一个新的数据库,该数据库只是“IdSection - 日期 - 阶段”,并计算间隔内每个部分和每一天的阶段。
    优点:

    • 这使得运行时计算保持为每个部分一个查询
    • Access 应适用于大量数据
      缺点:
    • 我无法手动检查我所做的对于所有部分是否正确
    • 启动时需要很长时间,非常长
    • 该数据库中需要大量条目

现在我问你更喜欢哪种,或者即使有不同的方法?我无法真正改变我所拥有的数据点。

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

感谢您的想法,任何此类事情的经验都会有所帮助

最佳答案

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

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

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

本例中的答案应类似于以下形式:

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 View 中包含以下代码:

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 View 中输入以下代码:

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 结构来解决您的问题的数据/计算部分。

关于sql - 日期/时间点/间隔的(关系)数据库性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13986215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com