我是 sql 的初学者,我需要编写一个 SP 来增加产品视图计数。当用户在网站上搜索时,我们希望增加搜索返回的所有产品的计数器。我发现我的 SP 存在两个问题:
- 它使用光标
- 它开始了很多交易
SP 被许多线程同时调用。在我实现它之后,我得到了很多超时异常。我的计数表如下所示:
ProductsViewsCount(ProductId int, Timestamp datetime, ViewType int, Count int)
Tiemstamp 列四舍五入到调用 SP 的 .net 代码中最接近的小时。基本上我会按小时计算观看次数。
SP 看起来像这样:
CREATE PROCEDURE [dbo].[IncrementProductsViews]
-- Add the parameters for the stored procedure here
@ProductsIds as varchar(max) = '', --CSV ids of products that were returned by search
@ViewType int,
@Timestamp datetime
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @id int
DECLARE idsCursor CURSOR FOR
SELECT Data FROM dbo.Split(@ProductsIds,',')
OPEN idsCursor
FETCH NEXT FROM idsCursor INTO @id
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRAN
UPDATE dbo.ProductsViewsCount SET Count = Count + 1
WHERE ProductId = @id AND ViewType = @ViewType AND Timestamp = @Timestamp
if @@rowcount = 0
BEGIN
INSERT INTO dbo.ProductsViewsCount (ProductId, Timestamp, ViewType, Count)
VALUES (@id, @Timestamp, @ViewType, 1)
END
COMMIT TRAN
FETCH NEXT FROM idsCursor INTO @id
END
CLOSE idsCursor
DEALLOCATE idsCursor
select 1
END
我能以更有效的方式做到这一点吗?