有如下数据表tb_Product:productId int
productName nvarchar(250)
Model nvarchar(80)
displayRank int
productPicture nvarchar(100)
brand nvarchar(50)
keyWords nvarchar(150)
mainSpecification nvarchar(100)
price nvarchar(50)
pagerRank0 int 现在productName上建立了全文索引,现在需要编写一个基于全文索引的搜索排序并分页的T-SQL语句(存储过程)
排序时,需要根据表中pagerRank0字段的值和全文索引中表示匹配度的rank的值的进行乘积后按乘积后的值的大小进行排序并分页显示。现在tb_product表中有60万的信息,每次根据productName进行全文搜索时可能会返回几百甚至几万条纪录,因此每次查询都要花费比较常的时间(15秒左右),我编写的分页代码如下:
求第一页的前16条纪录:
select top 16 f.RANK * p.pagerRank0 AS ranks, p.* FROM FREETEXTTABLE([tb_product], (productname), 'caps') AS f RIGHT OUTER JOIN tb_product AS p ON f.[KEY] = p.productId WHERE f.RANK > 0 and isPassAudit='true' ORDER BY ranks DESC求第三页的代码如下:
SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY f.RANK * p.pagerRank0 DESC) AS rownum, f.RANK * p.pagerRank0 AS ranks, p.*
FROM FREETEXTTABLE([tb_product], (productname), 'caps') AS f RIGHT OUTER JOIN tb_product AS p ON f.[KEY] = p.productId WHERE f.RANK > 0 and isPassAudit='true') AS D
where rownum BETWEEN 33 AND 48 ORDER BY d.ranks DESC现在主要的问题是:在显示第一页数据时时需要全文检索整个表,因此速度比较慢,但显示其它页时,由于数据已经缓存到内存中,因此速度就很快了,因此请高手能否先解决第一页速度慢的问题?是否能对我写的T-SQL进行优化。
productName nvarchar(250)
Model nvarchar(80)
displayRank int
productPicture nvarchar(100)
brand nvarchar(50)
keyWords nvarchar(150)
mainSpecification nvarchar(100)
price nvarchar(50)
pagerRank0 int 现在productName上建立了全文索引,现在需要编写一个基于全文索引的搜索排序并分页的T-SQL语句(存储过程)
排序时,需要根据表中pagerRank0字段的值和全文索引中表示匹配度的rank的值的进行乘积后按乘积后的值的大小进行排序并分页显示。现在tb_product表中有60万的信息,每次根据productName进行全文搜索时可能会返回几百甚至几万条纪录,因此每次查询都要花费比较常的时间(15秒左右),我编写的分页代码如下:
求第一页的前16条纪录:
select top 16 f.RANK * p.pagerRank0 AS ranks, p.* FROM FREETEXTTABLE([tb_product], (productname), 'caps') AS f RIGHT OUTER JOIN tb_product AS p ON f.[KEY] = p.productId WHERE f.RANK > 0 and isPassAudit='true' ORDER BY ranks DESC求第三页的代码如下:
SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY f.RANK * p.pagerRank0 DESC) AS rownum, f.RANK * p.pagerRank0 AS ranks, p.*
FROM FREETEXTTABLE([tb_product], (productname), 'caps') AS f RIGHT OUTER JOIN tb_product AS p ON f.[KEY] = p.productId WHERE f.RANK > 0 and isPassAudit='true') AS D
where rownum BETWEEN 33 AND 48 ORDER BY d.ranks DESC现在主要的问题是:在显示第一页数据时时需要全文检索整个表,因此速度比较慢,但显示其它页时,由于数据已经缓存到内存中,因此速度就很快了,因此请高手能否先解决第一页速度慢的问题?是否能对我写的T-SQL进行优化。
解决方案 »
- 数据库不能附加。dbcc rebuild_log('aaa','D:\aaa.ldf')出现这样的错误如何解决!!
- 高分求解!~~~~
- 在企业管理器中看错误日志,源:spid55,spid56等等,是什么意思呀?还有:错误日志一定是记载错误吗?
- 查询没有某个字母语句?
- 如何 定义 大容量的 字符变量 ?????????????????? 急!!!!!!!!!!!!!!!!!!!!
- 求一条简单的sql语句 (在线等。。。解决马上结贴给分)
- Microsoft SQL Server 錯誤:14294
- 一个简单的多表统计问题。
- 下面的要求怎么写最优化的语句?
- 简单问题:将四个union起来的数据集合选到一个临时表中
- sql server 2008中数据库生成脚本的问题
- 外网远程连接局域网内的多台SQL服务器,请各位帮忙解答,谢谢!
EXEC sp_tableoption 'tb_product','pintable', 'true'
后再通过
Select ObjectProperty(Object_ID('tb_product'),'TableIsPinned') 查看,发现还是没有把整个表都缓存到内存,谁能知道该怎么把整个数据表都缓存到内存吗
DBCC FREEPROCCACHE
go
select f.RANK * p.pagerRank0 AS ranks, p.productid FROM FREETEXTTABLE([tb_product], (productname), 'tools') AS f right JOIN tb_product AS p ON f.[KEY] = p.productId WHERE f.RANK > 0系统返回4000条左右的纪录,但尽然要耗时7秒钟!不知道高手能否帮忙优化一下,在tb_product表中对productid进行了聚集索引(主键自增)。
into #temp
from FREETEXTTABLE([tb_product], (productname), 'caps') as f
WHERE f.RANK > 0
需要多长时间,如果时间不多,可以考虑分开操作,再连接排序