这段存储过程需要怎么优化才行,现在的执行速度有点慢,在数据库都已经需要1秒了

ycproc 2012-03-31 03:32:21
现在的这个存储过程有点慢,在数据库的查询时间就已经在1秒左右
前台我需要逻辑判断,所以这是不行的!看看能够怎么优化吧!


/****** Object: StoredProcedure [dbo].[Query_SerchResultList] Script Date: 03/31/2012 15:22:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[Query_SerchResultList](
@type INT, --1微博/2用户/3微群
@serchtag VARCHAR(20), --搜索关键词
@pageindex INT, --页码
@pagesize INT, --数据大小
@isCount INT --是否需要得到行数
)
AS
DECLARE @sqlstr NVARCHAR(4000)
DECLARE @taghave INT

IF @isCount = 0
BEGIN
--搜索微博
IF @type = 1
BEGIN
SET @sqlstr =
'SELECT *
FROM (
SELECT mb.ApplicationID,
mb.BlogContent,
mb.BlogUntreatedContent,
mb.BlogSender,
mb.BlogForward,
mb.BlogFrom,
mb.IsFirstPub,
mb.BlogTime,
mb.IsDeleted,
mb.CommentCount,
mb.ForwardCount,
mb.OriginalBlogID,
gi.GName,
gi.GId,
ROW_NUMBER() OVER(ORDER BY BlogTime DESC) AS Num
FROM MicroBlog mb
LEFT OUTER JOIN GroupInfo gi
ON gi.GId = mb.GroupID
WHERE mb.IsDeleted = 0
AND mb.BlogContent LIKE ''' + '%' + @serchtag +
'%' +
'''
)t1
WHERE t1.Num BETWEEN (' + CAST(@PageSize AS VARCHAR) + ' * (' +
CAST(@PageIndex AS VARCHAR) + ' -1)) AND (' + CAST(@PageSize AS VARCHAR)
+ ' * ' + CAST(@PageIndex AS VARCHAR) +
')
ORDER BY t1.BlogTime DESC';
END

--搜索用户
IF @type = 2
BEGIN
SET @sqlstr = 'SELECT TOP ' + CAST(@pagesize AS VARCHAR) +
'
a.UserID,a.NickName,a.MyDiscription,a.SelfPicture,a.ConcernedCount,a.ConcerningCount,b.validated
FROM UserInfo a, SysUser b
Where a.NickName LIKE + ''' + '%' + @serchtag + '%' +
'''
AND a.UserID = b.UserID
AND a.UserID
NOT IN
(
SELECT TOP (' + CAST(@pagesize AS VARCHAR) + ' * ('
+
CAST(@pageindex AS VARCHAR) +
' - 1)) a.UserID
FROM UserInfo a, SysUser b
Where a.NickName LIKE + ''' + '%' + @serchtag + '%'
+
'''
AND a.UserID = b.UserID
ORDER BY BlogCount desc
)
ORDER BY BlogCount desc';
END

--搜索微群
IF @type = 3
BEGIN
SET @sqlstr = 'SELECT TOP ' + CAST(@pagesize AS VARCHAR) +
'
a.GClassName,b.GId,b.GImage,b.GName,b.GSpeakSize,b.GUserSize,b.GDescription,b.GCreateDate,c.NickName,c.UserID
FROM GroupClass a,GroupInfo b,UserInfo c
WHERE a.GClassId = b.GGroupId
AND b.GUserid = c.UserID
AND b.GPrivate = 1
AND b.GName LIKE + ''' + '%' + @serchtag + '%' +
'''
AND b.GId
NOT IN
(
SELECT TOP (' + CAST(@pagesize AS VARCHAR) + ' * ('
+
CAST(@pageindex AS VARCHAR) +
' - 1)) b.GId
FROM GroupClass a,GroupInfo b,UserInfo c
WHERE a.GClassId = b.GGroupId
AND b.GUserid = c.UserID
AND b.GPrivate = 1
AND b.GName LIKE + ''' + '%' + @serchtag + '%' +
'''
ORDER BY b.GScore desc
)
ORDER BY b.GScore desc';
END

EXEC (@sqlstr)
IF @serchtag <> ''
BEGIN
--是否已经存在此次搜索的keyword
SELECT @taghave = COUNT(ID)
FROM SerchRecord
WHERE Keyword = CAST(@serchtag AS VARCHAR)

--如果存在则做更新操作
IF @taghave > 0
BEGIN
UPDATE SerchRecord
SET SerchTime = GETDATE(),
SerchSize = (SerchSize + 1)
WHERE Keyword = @serchtag
END--如果不存在则做新增的操作
ELSE
BEGIN
INSERT INTO SerchRecord
(
ID,
Keyword,
SerchTime,
SerchSize
)
VALUES
(
NEWID(),
@serchtag,
GETDATE(),
1
)
END
END
END

IF @isCount = 1
BEGIN
--搜索微博
IF @type = 1
BEGIN
SET @sqlstr =
'SELECT COUNT(*)
FROM MicroBlog mb
WHERE mb.IsDeleted = 0 and mb.BlogContent LIKE ''' + '%' + @serchtag
+ '%' + '''';
END

--搜索用户
IF @type = 2
BEGIN
SET @sqlstr =
'
SELECT COUNT(a.UserID)
FROM UserInfo a,
SysUser b
WHERE a.NickName LIKE + ''' + '%' + @serchtag +
'%
' +
'''
AND a.UserID = b.UserID
';
END

--搜索微群
IF @type = 3
BEGIN
SET @sqlstr =
'

SELECT COUNT(b.GId)
FROM GroupClass a,
GroupInfo b,
UserInfo c
WHERE a.GClassId = b.GGroupId
AND b.GUserid = c.UserID
AND b.GPrivate = 1
AND b.GName LIKE + ''' + '%' + @serchtag +
'%
' + '''';
END

EXEC (@sqlstr)
END

...全文
189 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 11 楼 的回复:

引用 10 楼 的回复:
引用 9 楼 的回复:

1秒还嫌慢?


1秒只是在数据库的时间,我在前台页面很多逻辑判断更需要时间了
我想尽量优化在毫秒级
一个数据反应就可到秒级,你要求的毫秒级,未必太苛刻了.


额 好吧, 看来还是作罢吧。
[/Quote]

一秒已经很快的了,毫秒级很多时候只可以想......
ycproc 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

引用 10 楼 的回复:
引用 9 楼 的回复:

1秒还嫌慢?


1秒只是在数据库的时间,我在前台页面很多逻辑判断更需要时间了
我想尽量优化在毫秒级
一个数据反应就可到秒级,你要求的毫秒级,未必太苛刻了.
[/Quote]

额 好吧, 看来还是作罢吧。
dawugui 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
引用 9 楼 的回复:

1秒还嫌慢?


1秒只是在数据库的时间,我在前台页面很多逻辑判断更需要时间了
我想尽量优化在毫秒级
[/Quote]一个数据反应就可到秒级,你要求的毫秒级,未必太苛刻了.
ycproc 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

1秒还嫌慢?
[/Quote]

1秒只是在数据库的时间,我在前台页面很多逻辑判断更需要时间了
我想尽量优化在毫秒级
dawugui 2012-03-31
  • 打赏
  • 举报
回复
1秒还嫌慢?
Felixzhaowenzhong 2012-03-31
  • 打赏
  • 举报
回复
你的动态语句执行部分 用 exec sp_executesql 这种方式执行试一下。这种缓存中保留执行计划,你那种是不保留的,每次都编译重新生成执行计划
fanzhouqi 2012-03-31
  • 打赏
  • 举报
回复
分页啊
duoxu1983 2012-03-31
  • 打赏
  • 举报
回复
感觉没有可优化的地方了。看表的数据量了。
  • 打赏
  • 举报
回复
梦想鳖 2012-03-31
  • 打赏
  • 举报
回复
我不灌水
ycproc 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

好长好长。
[/Quote]

主要的效率问题 出现在 IF @isCount = 1 取行数 的时候 才变得很慢

  • 打赏
  • 举报
回复
技术帖 不要灌水

坐等高人
--小F-- 2012-03-31
  • 打赏
  • 举报
回复
好长好长。

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧