【发布时间】:2016-03-09 04:34:11
【问题描述】:
我有一个名为Optimized_GetArticlePost 的存储过程,我想对其进行优化。
当前存储过程:
CREATE PROCEDURE [dbo].[Optimized_GetArticlePost]
(@PostID int)
--[Optimized_GetArticlePost]
AS
BEGIN
SET NOCOUNT ON;
//declare all the required variables..
-- LIST ALL ATTACHMENTS
SELECT [FileName]
FROM CS_PostAttachments
WHERE contenttype LIKE 'audio/mpeg'
AND FILENAME LIKE '%.mp3'
AND isremote = 1
AND postid = @Postid ------returns a seperate table
--GET THE FB FEED IMAGES FOR THIS POST
SELECT ImageURL
FROM PostFBImageURL
WHERE PostID = @PostID------returns a seperate table
--GET STORY AT GLANCE DATA
SELECT
StoryImage, StoryContent, ALT
FROM
PostRelatedData
WHERE
PostID = @PostID------returns a seperate table
--GET POST REFERENCES
SELECT ReferenceData
FROM PostReferences
WHERE PostID = @PostID------returns a seperate table
END
从上面的存储过程中,每个select 语句都会返回一个表.. 我不想也想消除它
优化的存储过程:
CREATE PROCEDURE [dbo].[Optimized_GetArticlePost]
(@PostID int)
--[Optimized_GetArticlePost] 715049
AS
BEGIN
------------------------------------------------------------
----Declare variable table...
DECLARE @Temp TABLE (FileName nvarchar(MAX),
ImageURL VARCHAR(MAX),
StoryImage nvarchar(MAX),
StoryContent nvarchar(MAX),
ALT nvarchar(MAX),
ReferenceData nvarchar(MAX) )
SET NOCOUNT ON;
-- LIST ALL ATTACHMENTS
INSERT INTO @Temp (FileName)
SELECT [FileName]
FROM CS_PostAttachments
WHERE contenttype LIKE 'audio/mpeg'
AND FILENAME LIKE '%.mp3'
AND isremote = 1
AND postid = @Postid
--GET THE FB FEED IMAGES FOR THIS POST
INSERT INTO @Temp (ImageURL)
SELECT ImageURL
FROM PostFBImageURL
WHERE PostID = @PostID
--GET STORY AT GLANCE DATA
INSERT INTO @Temp (StoryImage,StoryContent,ALT)
SELECT StoryImage, StoryContent, ALT
FROM PostRelatedData
WHERE PostID = @PostID
--GET POST REFERENCES
INSERT INTO @Temp (ReferenceData)
SELECT ReferenceData
FROM PostReferences
WHERE PostID = @PostID
SELECT * FROM @postDate
END
在上述优化的存储过程中,我将数据插入到一个表变量中,并在最后一次从该临时表中进行选择..
所以,我的问题是:这是否是优化存储过程的正确方法..或者想要在这种情况下如何优化的建议。
提前致谢
【问题讨论】:
-
最好使用
UNION ALL,而不是插入到表变量中。 -
您尚未将数据插入临时表,您已将数据插入到表变量中。在处理多行时,临时表比表变量要好。
-
这部分你的 WHERE 子句似乎不正确: contenttype LIKE 'audio/mpeg' 。您在音频/mpeg 之前是否缺少“%”?
-
@Igor 你能用代码说明一下吗...
-
@t-clausen.dk 你的意思是说我应该使用临时表而不是使用表变量...对吗?
标签: sql sql-server stored-procedures optimization