保存来自另一个表的行计数的表字段

时间:2009-03-25 03:04:15

标签: sql database

我有一个字段,我想存储另一个表中某些行的数量。创建行时,我一直在递增此值,但感觉这可能不是最好的方法。再说一次,我不认为每次在桌子上“计数”都有意义。什么是最好的方法?

编辑: 计数已过滤

6 个答案:

答案 0 :(得分:2)

创建 INSERT 触发器以增加产品数量。

alt text

这是代码

create table Products ( ID int identity primary key )
GO
create table ProductCounter ( ProductCount int not null default 0 )
GO
insert ProductCounter default values
GO
create trigger trgIncrementProductCount
on Products
after insert
as
begin
    update  ProductCounter
    set ProductCount = ProductCount + 1
end
GO

insert Products default values
insert Products default values
select * from ProductCounter

insert Products default values
insert Products default values
select * from ProductCounter

答案 1 :(得分:1)

如果是sql server,你可以为insert和delete设置触发器来增加/减少值。

或者您可以查看它。

或者,正如我所做的那样,每次只做一次计数(*),除非它是一张巨大的桌子。

答案 2 :(得分:1)

如果您要查找的值是第一个表中的行数,那么操作的成本远低于检查/更新第二个表然后查询其中的值的开销。

答案 3 :(得分:1)

注意这是一个特定的Sql Server答案,首先我不确定是否

select count(*) from table 

确实进行了全表扫描,执行计划表明确实如此。 Iff,这是真的,那么你可以使用系统表查找表中的行数,这将更快,尤其是在大型表上。

select rowcnt from sysindexes
inner join sysobjects on sysobjects.id = sysindexes.id
where xtype='U'
and sysobjects.name = 'YourTableName'
and indid = 0

我知道这依赖于可能会发生变化的系统表,但这些表在过去十年中还没有,它还依赖于您的表具有主键。因此,不是存储行数,而是快速但讨厌的查找。

答案 4 :(得分:1)

虽然你从来不想在理想的世界中将计算值存储在数据库中,但在现实世界的泥泞和泥土中经常需要这样做。

因此克里斯建议触发器是你最好的选择。您可能必须在每次触发器调用后重新查询计数,因为可能无法始终知道插入或删除了多少行(取决于RDBMS),如果有可能需要多个查询,您可能需要多次查询计数可能受单个INSERT或DELETE语句的影响。

并且,由于您还在计算特定行,因此您还需要一个UPDATE触发器,以防其中一个值被计数过滤器更改。

因此,触发器或触发器(您可以将它们全部打包到单个INSERT / UPDATE / DELETE触发器中)可能会非常复杂。

答案 5 :(得分:1)

这个行数需要多长时间?是否有可能像cron一样运行每隔几个小时更新一次?简单的SELECT COUNT(ID)FROM表WHERE ... yada yada。每次查询后都不会依赖额外的更新。

只是一个沉重的......