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