对基于时间的数据的不同方法的表现

时间:2010-12-07 09:39:32

标签: sql-server database-design sybase

我在PerformanceDBA在this answer to another question中声明此查询的上下文中询问此问题:

SELECT  ProductId,
        Description
    FROM  Product       p,
          ProductStatus ps
    WHERE p.ProductId = ps.ProductId  -- Join
    AND   StatusCode  = 2             -- Request
    AND   DateTime    = (             -- Current Status on the left ...
        SELECT MAX(DateTime)          -- Current Status row for outer Product
            FROM  ProductStatus ps_inner
            WHERE p.ProductId = ps_inner.ProductId
            )

使用ProductStatus表只保存状态随时间变化的有效(开始)日期,将胜过此查询:

SELECT  ProductId,
        Description
    FROM  Product       p,
          ProductStatus ps
    WHERE p.ProductId = ps.ProductId  -- Join
    AND   StatusCode  = 2             -- Request
    AND   getdate() BETWEEN DateFrom AND Dateto

使用ProductStatus表,该表同时包含状态的开始和结束日期。

虽然我接受第一种方法的优于第二种方法的其他声明,但我希望第二种方法更快(基于我对Oracle的经验),因为它只是过滤数据而不是执行额外的子查询并与之进行比较。

我想知道Sybase或SQL Server如何处理这些查询,以及一些简单测试的相对性能。

2 个答案:

答案 0 :(得分:14)

答案 1 :(得分:10)

尝试将性能集成到数据库设计总是会导致后来的悲伤。

正如在另一个主题中辩论的那样,如果您知道状态生效的日期,那么您就知道上一个状态到期的日期。存储ValidFrom和ValidUntil是一种异端邪说;请考虑以下示例,该程序由正在调试的程序创建:

Status    ValidFrom   ValidUntil
Open     1 Jan 2010  30 Jan 2010
Closed  20 Jan 2010  30 Mar 2010

该模型允许产品在同一时刻具有2种状态,这是其他程序员在同一数据库上调试的乐趣,所有报告都开始重复。

正确设计您的数据库,直到您可以承受的任何正常形式。

在生产规格框上使用生产量进行测试。如果表现不够,那么,你就可以了解到哪里可以调整。