我很好奇有什么解决方案可以对记录事件的表进行分区,既可以进行高效查询,又可以在截断数据时发挥修剪的优势。
假设我有一个简单的表来记录来自不同位置的事件:
tblEvents (
event_id,
location_id,
start_datetime,
end_datetime
)
此表上的大多数查询将采用以下形式:
SELECT event_id
FROM tblEvents
WHERE location_id = @queried_location_id
AND start_datetime < @queried_end_datetime
AND end_datetime > @queried_start_datetime
迄今为止,我已经按 location_id 进行了分区,并且只是对日期时间列进行了索引。就性能而言,这已经足够了,而且我从来没有计划在数据库中保留超过几个月的数据,所以它似乎也是面向未来的。
当我实际从这个表中清除数据时出现了问题(它非常大并且还涉及复制)。事实证明,使用DELETE FROM tblEvents WHERE start_datetime < @some_date
非常慢,并且会在其他客户端发出请求时产生问题(不足为奇)。
按任一日期时间列进行分区都不好。虽然它解决了我的数据清除问题,但它使上面的查询效率低下,因为它仍然需要根据查询的日期查看多个分区。
我在这里缺少一个通用的解决方案吗?有没有更有效的方法来清除我的数据?还是有一种我错过的更智能的分区/索引方法?