22,302
社区成员




ALTER PROCEDURE [dbo].[corpListRealUser]
-- Add the parameters for the stored procedure here
@myContinent varchar(10), --传入洲的值
@myCountrys varchar(50), --传入国家的值;已处理成sql条件语句,后面说明
@myCategoryB varchar(10), --传入大类的值
@myCategorys varchar(50), --传入小类的值;已处理成sql条件语句,后面说明
@myTopic decimal, --传入主题的ID
@myPriceL int, --传入价格范围的起始
@myPriceH int, --传入价格范围的终点
@myOrderType int, --传入排序类型(按时间,价格,点击量,购买量)
@myOrderFlag int, --传入排序标志(升序还是降序)
@mySerKeyword varchar(500), --传入关键字
@CI_StartRecordIndex int, --传入分页起始点
@CI_EndRecordIndex int --传入分页终结点
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
declare @str varchar(max),@strOrder varchar(200)
set @str=''
if @myTopic>0
begin
set @str=@str+'and topic_ID='+rtrim(@myTopic)
end
if @myPriceH<500
begin
set @str=@str+' and CI_Charge BETWEEN '+rtrim(@myPriceL)+' AND '+rtrim(@myPriceH)
end
if @myContinent<>'0'
begin
set @str=@str+'and Country_Continent='+rtrim(@myContinent)
end
if @myCountry<>'0'
begin
set @str=@str+@myCountrys
end
if @myCategoryB<>'0'
begin
set @str=@str+'and C_FatherID='+rtrim(@myCategoryB)
end
if @myCategoryS<>'0'
begin
set @str=@str+@myCategorys
end
--这里的myCountrys和myCategorys都已在前台程序处理成:and (charindex(',195,',','+InfoReal.C_ChildID)> 0 or charindex(',81,',','+InfoReal.C_ChildID)> 0 or charindex(',64,',','+InfoReal.C_ChildID)> 0-----这种语句,结合我最上面举例到的三个帖子,大侠的给我建议是把charindex改为like;然后把or,改为union all模式-----因为语句的问题,还有其他条件,改成union all我也是比较的懵,不太会改;然后第二个帖子提到了,结构问题,很关键,让我意识到我不改结构,其实速度是无法改变慢的局面的。
if @mySerKeyword<>''
begin
set @str=@str+'and (CI_SearchKey like ''%'+ @mySerKeyword +'%'')'
end
--以下部分是排序条件
set @strOrder=''
declare @orderPX varchar(10)
if @myOrderFlag=1
set @orderPX=' asc'
else
set @orderPX=' desc'
if @myOrderType=1
begin
set @strOrder=@strOrder+'order by CI_ModifyTime'+@orderPX
end
else if @myOrderType=2
begin
set @strOrder=@strOrder+'order by CI_Charge'+@orderPX
end
else if @myOrderType=3
begin
set @strOrder=@strOrder+'order by CI_ClickTimes'+@orderPX
end
else if @myOrderType=4
begin
set @strOrder=@strOrder+'order by CI_BuyTimes'+@orderPX
end
else
begin
set @strOrder=@strOrder+'order by CI_ModifyTime'+@orderPX
end
--下面部分简单说明:1、infoReal表为了加快速度,最初关键字搜索匹配是跟CI_CorpName和CI_Keywords和CI_Profile用or连接;后来加了CI_SearchKey这个字段,取值是把前面三个字段值结合,然后截取250个字符做的搜索关键字。2、为了加快速度,我最大也只取600条数据;如果数据库匹配的数据多,速度是相对快点,如果没有匹配或者没有达到600条,就会表全部扫描一遍(加上分页读取记录总数,相当于2边),速度就相对比较慢。3、搜索相关的条件字段我都有做索引,CI_ID是主键唯一,聚集索引我是做在了CI_SearchKey这个字段上(就是搜索关键字)4、CI_StateFlag=1 or CI_StateFlag=3这里我用了OR结构是不是索引也不起效果了??这个字段是用来判断数据是否在前台显示的判断标识符。
declare @sql varchar(max)
set @sql = 'select * from
(select top 600 row_number() over ('+rtrim(@strOrder)+',CI_ID desc)as Row,
CI_ID,CI_CorpName,CI_Profile,CI_StateFlag,CI_Charge,CI_ModifyTime,CI_ClickTimes,CI_BuyTimes,Country_ID from TE_CorpInfoReal where (CI_StateFlag=1 or CI_StateFlag=3) '+@str+') t
WHERE 1=1 AND Row BETWEEN '+rtrim(@CI_StartRecordIndex)+' AND '+rtrim(@CI_EndRecordIndex)+' order by row'
exec(@sql)
END