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

前端之家收集整理的这篇文章主要介绍了sql – 日期/时间点/间隔的(关系)数据库性能前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我在Access sql中做了一个项目,它很顺利.我已经学到了很多关于Access和VBA的知识,这个网站在这个过程中很有帮助.

现在我面临的问题是性能问题,因为我在这种sql工作方面没什么经验,所以我来这里是为了一些想法.

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

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

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

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

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

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

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

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

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

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

>可以手动确认数据并以次要形式显示
>它使数据库变小
坏处:
>实际循环需要通过(最差)所有阶段才能找到正确的循环.

>计算一个新的数据库,它只是“IdSection – Date – Phase”,并计算一个区间内每个Section和EVERY日的阶段.
优点:

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

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

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

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

解决方法

如果我理解你,你有一系列类似于表格的数据:
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,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结构,用于解决问题的数据/计算部分.

猜你在找的MsSQL相关文章