总体挑战:
我们每天为多个“市场”添加数次商品。
所以
- 在 12:00 我们为市场“x”添加 2000 个项目
- 在 12:30 我们为市场“y”添加 3000 个项目
- 在 14:00 我们再次为市场“x”添加 2500 个项目
每天进行几次。
在任何给定时间,我们都需要每天为每个市场提取最新项目
上述插入的期望结果是
市场“x”的 2500 个项目
市场“y”的 3000 个项目
一批数据的每次添加都有一个 ExecutionTime 时间戳,该时间戳唯一地定义了该批。因此,市场“x”在 12:00 的 2000 个项目将具有相同的 ExecutionTime 值,而市场“x”在 14:00 的 2500 个项目将具有另一个 ExecutionTime 值。
我们为我们创建了一个视图
SELECT
*
FROM
dbo.Items AS s
WHERE
(ExecutionTime =
(SELECT MAX(ExecutionTime) AS Expr1
FROM dbo.Items AS s2
WHERE (SiteAlias = s.SiteAlias) AND (Market = s.Market)
AND (LocalTimestamp >=
DATEADD(dd, DATEDIFF(dd, 0, s.LocalTimestamp), 0))
AND
(LocalTimestamp <
DATEADD(dd, DATEDIFF(dd, 0, s.LocalTimestamp), 1))))
我们这样查询视图:
SELECT *
FROM [ExportedData]
WHERE
SiteAlias = 'MyAlias'
AND LocalTimeStamp between '2012-05-14 00:00' AND '2012-05-18 00:00'
ORDER BY [Timestamp]
我们在执行时间字段上定义了表 ITems 上的索引,并在 sitealias、marked 和 localtimestamp 上定义了组合索引。
问题:性能很差。查询大约 150000 行需要几分钟时间。
我们应该做的视图有什么明显的改进吗?我已经准备好提供查询计划等 - 以防我们在创建视图时没有简单的搞砸。
有趣的是,如果我们在 SiteAlias 上使用“LIKE”而不是“=”来查询视图,它会加快大约 90% 的执行速度——这是我没有预料到的。
谢谢,
:o)
/杰斯珀哥本哈根