我在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如何处理这些查询,以及一些简单测试的相对性能。
答案 0 :(得分:14)
答案 1 :(得分:10)
尝试将性能集成到数据库设计总是会导致后来的悲伤。
正如在另一个主题中辩论的那样,如果您知道状态生效的日期,那么您就知道上一个状态到期的日期。存储ValidFrom和ValidUntil是一种异端邪说;请考虑以下示例,该程序由正在调试的程序创建:
Status ValidFrom ValidUntil
Open 1 Jan 2010 30 Jan 2010
Closed 20 Jan 2010 30 Mar 2010
该模型允许产品在同一时刻具有2种状态,这是其他程序员在同一数据库上调试的乐趣,所有报告都开始重复。
正确设计您的数据库,直到您可以承受的任何正常形式。
在生产规格框上使用生产量进行测试。如果表现不够,那么,你就可以了解到哪里可以调整。