Поле таблицы, которое содержит количество строк из другой таблицы - PullRequest
2 голосов
/ 25 марта 2009

У меня есть поле, в котором я хочу сохранить количество определенных строк из другой таблицы. Я увеличивал это значение при создании строк, но чувствую, что это, вероятно, не лучший способ. И снова я не думаю, что каждый раз имеет смысл делать «подсчет» на рассматриваемой таблице. какой подход лучше?

EDIT: Отсчет отфильтрован

Ответы [ 6 ]

2 голосов
/ 25 марта 2009

Создайте 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 голос
/ 25 марта 2009

Как часто нужно это количество строк? Можно ли запускать что-то вроде cron для обновления каждые несколько часов? Простой SELECT COUNT (ID) из таблицы ГДЕ ... yada yada. Он не будет полагаться на дополнительное обновление после каждого запроса.

Просто обдумывание ...

1 голос
/ 25 марта 2009

Хотя вы никогда не захотите хранить вычисленное значение в базе данных в идеальном мире, это часто необходимо здесь, в грязи и гадости реального мира.

Так что предложение Криса о триггере - ваша лучшая ставка. Возможно, вам придется запрашивать количество после каждого вызова триггера, поскольку не всегда возможно узнать, сколько строк было вставлено или удалено (в зависимости от СУБД), и вам может потребоваться несколько запросов, если есть вероятность, что более одного из ваших на счет может повлиять один оператор INSERT или DELETE.

И, так как вы также подсчитываете определенные строки, вам также понадобится триггер UPDATE на случай, если одно из значений, по которым ваш фильтр отсчета изменился.

Таким образом, триггер или триггеры (возможно, вы сможете упаковать все это в один триггер INSERT / UPDATE / DELETE) могут быть довольно сложными.

1 голос
/ 25 марта 2009

Обратите внимание, что это конкретный ответ Sql Server, во-первых, я не уверен, если

select count(*) from table 

действительно выполняет полное сканирование таблицы, план выполнения говорит, что это так. Если это так, тогда вы можете искать количество строк в таблице, используя системные таблицы, и это будет быстрее, особенно для большой таблицы.

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

Я знаю, что это зависит от системных таблиц, которые могут меняться, но они не изменялись в течение последнего десятилетия, это также зависит от вашей таблицы, имеющей первичный ключ. Поэтому вместо того, чтобы хранить количество строк, у вас есть быстрый, но неприятный поиск.

1 голос
/ 25 марта 2009

Если искомым значением является количество строк в первой таблице, это будет гораздо более дешевой операцией, чем затраты на установку / обновление второй таблицы и последующий запрос значения из нее.

1 голос
/ 25 марта 2009

Если его sql-сервер, вы можете сделать триггеры для вставки и удаления, чтобы увеличить / уменьшить значение.

Или вы можете посмотреть на это.

Или, как я бы сделал, просто делайте счет (*) каждый раз, если это не огромный стол.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...