我的表格如下所示
Id | Customer_number | Customer_Name | Customer_owner
我想将Customer_Number作为特定于Customer_owner
的序列插入是1,2,3,....对于Customer_owner X和1,2,3,... Customer_owner Y。
要获取Customer_number,我可以使用以下SQL
SELECT COUNT(*) FROM Customer where Customer_owner='X'
我的问题是,是否有任何性能影响。特别适用于具有100,000条记录的表。 还有更好的选择吗?
答案 0 :(得分:1)
就性能而言,出于各种原因,我建议不向客户添加其他列:
在向所有者A添加客户时,需要更新所有业主的A相关客户,同样需要删除。
客户端数量多次重复 - 占用更多空间,从而(通常)减慢执行速度。
没有实际用途可以通过另一列将客户端数量链接到客户所有者,以获取描述单个客户的记录。
以及更多解释..
正确的普通表格将包含2个表格:
2.A。所有者(Owner_id,Owner_name,NumberOfCustomers)
OR
2.b中。拥有者(Owner_id,Owner_name)并在查询时自动计算NumberOfCustomers。
修改强> 由于您希望显示单个所有者的所有客户,我认为这是您的主要用途,您应该在Cust_Owner_id 上添加群集索引。然后,在查询时,性能会很好,因为它可以根据您所需的数据进行聚类。
在此处详细了解群集: Clustered Index
编辑2:
我刚刚通过最新评论意识到了您的意图,但我仍然会提出解决方案,特别针对您的问题,我不建议您应该存储所有一位所有者客户的号码,而是保留在Customers表中 SUBSCRIBED DATE列,并在查询时,确定显示的客户编号。 但是,如果您希望该数字是永久性的(由于订单1,2,3,... n可能会中断,因为客户可以被删除),只需使用Customer_Id,因为它已经是唯一的。
答案 1 :(得分:1)
您可以在需要时随时计算Customer_Number
:
select c.*, row_number() over (partition by Customer_Owner order by id) as CustomerNumber
from Customer c
这比尝试存储和维护数字更安全,这可能会受到系统中各种更新的影响。例如,想象一下当现有记录改变其所有权时更改编号的乐趣。
答案 2 :(得分:0)
如果您只需要在UI中使用唯一编号,则只需在UI中指定编号即可。如果你走这条路线,你需要确保你总是以相同的顺序检索客户,所以添加一个ORDER BY Id,或者做Gordon Linoff所建议的。