1
記事のタイトルに基づいて記事を検索するストアドプロシージャがあります。しかし、記事を閲覧した回数を数える同じテーブルの列を増やす必要もあります。複数のルックアップなしでデータを返し、行を更新しますか?
できるだけ効率的になろうと、私は、このアプローチには、2つの可能な方法を参照:ターゲット行のPKを得るための1つのSELECTを実行
を。その後、そのPKを使用してビューの数を増やし、最後にPKを使用して別のSELECTをクリックして記事データを返します。
SELECTを1回実行すると、アプリケーションに記事データが返され、返されたPKを使用してデータベースをもう一度ラウンドトリップしてビュー数を増やします。
私は#1がかなり速いことを知っていますが、それは3つのルックアップです。 #2はデータベースへの2回のラウンドトリップが必要です。このタスクを最適化する方法はありませんか?
EDITフィードバックに基づいて、私は次のことを思いつきました。コメントや建設的な批評をありがとう。
DECLARE @Slug VARCHAR(250) -- Stored procedure argument
-- declare @UpdatedArticle table variable
DECLARE @UpdatedArticle TABLE
(
ArtID INT,
ArtUserID UNIQUEIDENTIFIER,
ArtSubcategoryID INT,
ArtTitle VARCHAR(250),
ArtHtml VARCHAR(MAX),
ArtDescription VARCHAR(350),
ArtKeywords VARCHAR(250),
ArtLicenseID VARCHAR(10),
ArtViews BIGINT,
ArtCreated DATETIME2(7),
ArtUpdated DATETIME2(7)
);
UPDATE Article
SET ArtViews = ArtViews + 1
OUTPUT
INSERTED.ArtID,
INSERTED.ArtUserID,
inserted.ArtSubcategoryID,
INSERTED.ArtTitle,
INSERTED.ArtHtml,
INSERTED.ArtDescription,
INSERTED.ArtKeywords,
INSERTED.ArtLicenseID,
INSERTED.ArtViews,
INSERTED.ArtUpdated,
INSERTED.ArtCreated
INTO @UpdatedArticle
WHERE ArtSlugHash = CHECKSUM(@Slug) AND ArtSlug = @Slug AND ArtApproved = 1
SELECT a.ArtID, a.ArtUserID, a.ArtTitle, a.ArtHtml, a.ArtDescription, a.ArtKeywords, a.ArtLicenseID,
l.licTitle, a.ArtViews, a.ArtCreated, a.ArtUpdated, s.SubID, s.SubTitle, c.CatID, c.CatTitle,
sec.SecID, sec.SecTitle, u.UsrDisplayName AS UserName
FROM @UpdatedArticle a
INNER JOIN Subcategory s ON a.ArtSubcategoryID = s.SubID
INNER JOIN Category c ON s.SubCatID = c.CatID
INNER JOIN [Section] sec ON c.CatSectionID = sec.SecID
INNER JOIN [User] u ON a.ArtUserID = u.UsrID
INNER JOIN License l ON a.ArtLicenseID = l.LicID
おかげで、私はこれに慣れていませんでした。私は私の質問に追加した変更されたコードに関するコメントを感謝します。また、最初の条件に一致する行がないのに、何も見つからないことを確認したい場合はうまくいくようです。 –
あなたはこれで私に大きな頭痛を救った。 –