我有几个具有 IsActive 列的表,该列指示记录是活动的还是已删除。这些表被相当频繁地使用。
为这些表中的每一个创建一个视图并仅选择 IsActive 为 true 的记录是否很常见?或者这是矫枉过正?
我有几个具有 IsActive 列的表,该列指示记录是活动的还是已删除。这些表被相当频繁地使用。
为这些表中的每一个创建一个视图并仅选择 IsActive 为 true 的记录是否很常见?或者这是矫枉过正?
where
视图只是一个存储的查询——无论您在视图中还是在子句中检查 isActive,它都会以完全相同的方式执行。
如果您发现自己更频繁地使用 isActive 行,请查看过滤索引。例如,我们有一个票务系统,其中 99% 的活动与未结票有关。通过仅为活动工单添加过滤索引,我们能够大大提高性能。
为这些表中的每一个创建一个视图并仅选择 IsActive 为 true 的记录是否很常见?或者这是矫枉过正?
与其说是有问题的设计,不如说是矫枉过正。
该方法通常被称为“软”删除,其中记录被标记为特定状态以控制其可见性。这会占用空间,但可以轻松恢复记录 - 否则您只能从备份(或更糟 - 事务日志)中恢复。
我不会使用视图来查看表本身应该包含的内容。非物化视图只是一个宏,它用它封装的查询替换视图引用——对于给定查询中的每个实例。这对性能有一点好处,因为底层查询可能会被缓存。物化视图(SQL Server 术语中的索引视图)比非物化视图更好,但您也可以只为状态列建立索引(2008+,过滤索引可能是一个考虑因素)。在实际表中也没有混乱。这取决于,所以你最终必须根据数据和设置自己测试和查看。
根据状态对原始表进行分区是查询性能的另一种可能性,但仍需要在查询中指定。
可能,尽管索引视图是值得的。这取决于活动/非活动拆分。非索引视图只是一个扩展的宏,当您将视图连接到视图等时,它总是很容易添加 JOINS 来提高性能
并使用 SQL Server 2008 在 IsActive 上添加过滤索引