私はSQLの初心者であり、製品のビュー数を増やすためにSPを作成する必要があります。ユーザーがサイトで検索するとき、検索によって返されたすべての製品のカウンターをインクリメントしたいと思います。SPに2つの問題があります。
- カーソルを使用します
- それは多くのトランザクションを開始します
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
これをより効率的な方法で行うことはできますか?