为sql server选择查询
答
不要在表格中存储派生值 - 这是不好的设计。
由于总数是价格和数量的乘积,所以当您有这些数值时,您可以随时计算它 - 为什么要存储它?如果您这样做,您正在创建数据库中数据不一致的可能性。
直接从SQL检索这样的价值是微不足道的,而不需要存储它:
SELECT price, quantity, price * quantity AS total
FROM product
更新:
正如@马丁指出,2005+具有Computed Columns这是SQL服务器非持久性或索引列,作为方便返回计算结果。
我强调这些列是而不是持久存在。
答
可以为此
ALTER TABLE Products ADD total AS price * quantity
上述定义列既不坚持也不被索引创建一个计算列,因此是只为你的查询提供了方便。
如果您的查询需要在搜索谓词中使用total
,您可以考虑对这样的计算列进行索引。任何这样的持久值都由SQL Server自动维护,从而避免数据异常的潜在问题。
此外,在您正在进行此类查询的情况下,即使没有索引这些列,您的查询也可以从improved cardinality estimates due to statistics on the computed column中受益。
完全取决于OP的查询内容。如果他们想要通过'total'排序的'TOP 10'产品,那么计算列将对此有利。计算列几乎否定了所有的论点,因为它们确保不存在不一致数据的可能性,并且不必持久化。 – 2011-05-01 21:52:31
@Martin - 所以你同意'total'列不会被保留。 – Oded 2011-05-02 04:43:45
我没有说过。这取决于OP的查询内容。如果他们想要运行查询,例如“查找总数> 10000的所有产品”,那么索引它可能是合理的。 – 2011-05-02 12:30:33