2011-05-01 111 views
2

我有一个产品表。 在我的表中有一个像productid,价格,数量,总数字段。为sql server选择查询

比我multyply价格,数量字段和答案存储在总场。

回答

5

不要在表格中存储派生值 - 这是不好的设计。

由于总数是价格和数量的乘积,所以当您有这些数值时,您可以随时计算它 - 为什么要存储它?如果您这样做,您正在创建数据库中数据不一致的可能性。

直接从SQL检索这样的价值是微不足道的,而不需要存储它:

SELECT price, quantity, price * quantity AS total 
FROM product 

更新:

正如@马丁指出,2005+具有Computed Columns这是SQL服务器非持久性或索引列,作为方便返回计算结果。

我强调这些列是而不是持久存在。

+0

完全取决于OP的查询内容。如果他们想要通过'total'排序的'TOP 10'产品,那么计算列将对此有利。计算列几乎否定了所有的论点,因为它们确保不存在不一致数据的可能性,并且不必持久化。 – 2011-05-01 21:52:31

+0

@Martin - 所以你同意'total'列不会被保留。 – Oded 2011-05-02 04:43:45

+0

我没有说过。这取决于OP的查询内容。如果他们想要运行查询,例如“查找总数> 10000的所有产品”,那么索引它可能是合理的。 – 2011-05-02 12:30:33

1

可以为此

ALTER TABLE Products ADD total AS price * quantity 

上述定义列既不坚持也不被索引创建一个计算列,因此是只为你的查询提供了方便。

如果您的查询需要在搜索谓词中使用total,您可以考虑对这样的计算列进行索引。任何这样的持久值都由SQL Server自动维护,从而避免数据异常的潜在问题。

此外,在您正在进行此类查询的情况下,即使没有索引这些列,您的查询也可以从improved cardinality estimates due to statistics on the computed column中受益。