我有一张表,我想在其中跟踪布尔类型的操作。此外,业务要求是我知道操作的日期,而不仅仅是布尔值。
例如,如果一条消息被阅读或删除。
我想使用日期时间字段,以便我可以将所有未读消息量化为具有空值或日期时间值以供读取。我得到布尔运算和时间戳。
我对此唯一的疑虑是选择所有未读消息的效率如何?
假设在具有几百万条记录和字段上的非聚集索引(例如读取)的表中,选择的执行方式会比字段为布尔值时更差吗?
我有一张表,我想在其中跟踪布尔类型的操作。此外,业务要求是我知道操作的日期,而不仅仅是布尔值。
例如,如果一条消息被阅读或删除。
我想使用日期时间字段,以便我可以将所有未读消息量化为具有空值或日期时间值以供读取。我得到布尔运算和时间戳。
我对此唯一的疑虑是选择所有未读消息的效率如何?
假设在具有几百万条记录和字段上的非聚集索引(例如读取)的表中,选择的执行方式会比字段为布尔值时更差吗?
特定设计的性能在很大程度上取决于数据的分布和访问路径。您是希望大多数消息有标志,还是大多数消息没有?从文档:
当然,如果查询中有任何其他谓词,以及聚集索引(如果有)。例如,您是否可能希望在特定时间范围内访问所有未读消息?或发送给/从特定用户发送?消息体有多大,它们是否内联存储?请注意,这些只是修辞问题。
那么哪个更好,a
BIT
和 aDATETIME
还是仅DATETIME
用于性能?您必须使用一些具有代表性的数据和访问模式进行基准测试才能找出答案。恐怕仅凭理论无法回答这个问题。但是您当然可以使用布尔值创建表,如果您发现后者更好,则不要使用它 - 它只会增加每行 1 个字节的开销。如果您问的是相反的问题,即如何有效地查询非
NULL
行,我会说使用过滤索引。研究创建
index with included columns
. 检查此链接。如果要选择所有未读邮件并查看其日期,请在 READ 列上创建索引并包含 DATE 列。如果要选择日期范围并计算已读/未读消息的数量,请在 DATE 字段上创建索引并包含 READ 列。此外,您可以使用对应于未读的默认值(假设为 0)设置布尔 READ 列,而不是使用 NULL。不过,我不确定这是否会带来任何性能优势。