Возвращение данных и обновление строки без многократными поисками?


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

Стараясь быть как можно более эффективным, я искала способ сделать это без выполнения нескольких запросов. Кто-то указывал более поздние пункт Выход, который я использовал ниже.

Мне просто интересно, если я использую его в наиболее эффективным способом, если я действительно сделал это быстрее, а если есть какие-либо другие оптимизации, которые могут быть использованы.

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

Это используется в приложении ASP.NET с помощью SQL сервер 2008.



299
7
задан 29 января 2011 в 03:01 Источник Поделиться
Комментарии
3 ответа

Вы могли бы сделать все это в один шаг, как этот.

CREATE PROCEDURE dbo.IncrementArtViews (@Slug varchar(250)) AS

UPDATE a
SET ArtViews = ArtViews + 1
OUTPUT 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 dbo.Article a
INNER JOIN dbo.Subcategory s ON a.ArtSubcategoryID = s.SubID
INNER JOIN dbo.Category c ON s.SubCatID = c.CatID
INNER JOIN dbo.[Section] sec ON c.CatSectionID = sec.SecID
INNER JOIN dbo.[User] u ON a.ArtUserID = u.UsrID
INNER JOIN dbo.License l ON a.ArtLicenseID = l.LicID
WHERE a.ArtSlugHash = CHECKSUM(@Slug)
AND a.ArtSlug = @Slug
AND a.ArtApproved = 1

1
ответ дан 26 февраля 2011 в 10:02 Источник Поделиться

Создать представление. Обновить строку в вид, и вывести столбцы.

CREATE VIEW dbo.ArticleView AS
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 dbo.Article a
INNER JOIN dbo.Subcategory s ON a.ArtSubcategoryID = s.SubID
INNER JOIN dbo.Category c ON s.SubCatID = c.CatID
INNER JOIN dbo.[Section] sec ON c.CatSectionID = sec.SecID
INNER JOIN dbo.[User] u ON a.ArtUserID = u.UsrID
INNER JOIN dbo.License l ON a.ArtLicenseID = l.LicID
GO

CREATE PROCEDURE dbo.IncrementArtViews (@Slug varchar(250)) AS
UPDATE dbo.ArticleView
SET ArtViews = ArtViews + 1
OUTPUT ArtID, ArtUserID, ArtTitle, ArtHtml, ArtDescription,
ArtKeywords, ArtLicenseID, licTitle, ArtViews, ArtCreated,
ArtUpdated, SubID, SubTitle, CatID, CatTitle, SecID,
SecTitle, [UserName]
WHERE ArtSlugHash = CHECKSUM(@Slug)
AND ArtSlug = @Slug
AND ArtApproved = 1
GO

1
ответ дан 27 февраля 2011 в 04:02 Источник Поделиться

Я бы оптимизация не хранить мета-данные вместе с данными. Как посмотреть счет на самом деле повлиять на саму статью? Не на всех.

Это разные вещи... так что хранить его в другом месте.

0
ответ дан 30 января 2011 в 12:01 Источник Поделиться