Sql server TSQL-使用临时表优化全文搜索查询
简而言之,我有一个全文搜索查询,可以在单个表上搜索公司。搜索完成后,我会从结果中提取额外的统计信息,如前5名标题、前5名位置等 如何优化此查询当前在<25000行上执行大约需要5秒钟,并且根据执行计划,它主要在最后3条select语句上执行Sql server TSQL-使用临时表优化全文搜索查询,sql-server,tsql,full-text-search,temp-tables,Sql Server,Tsql,Full Text Search,Temp Tables,简而言之,我有一个全文搜索查询,可以在单个表上搜索公司。搜索完成后,我会从结果中提取额外的统计信息,如前5名标题、前5名位置等 如何优化此查询当前在
SQL SERVER:2005。我可以升级到2008,但我听说SQL 2008存在更多的性能问题 非常感谢您的帮助
你的执行计划结果可能是骗人的。在SQL2005中,全文引擎是一个外部服务,因此SQL无法准确地报告这一难题中发生的事情 我不确定您在2008年听说过哪些性能问题,但在2008年,全文引擎与数据库完全集成,在您这样的情况下,将数据库表与一组全文结果合并时,效率会更高。如果升级是你的一个选择,我鼓励你去追求这个选择
请参阅:您的执行计划结果可能具有欺骗性。在SQL2005中,全文引擎是一个外部服务,因此SQL无法准确地报告这一难题中发生的事情 我不确定您在2008年听说过哪些性能问题,但在2008年,全文引擎与数据库完全集成,在您这样的情况下,将数据库表与一组全文结果合并时,效率会更高。如果升级是你的一个选择,我鼓励你去追求这个选择
请参阅:“但我听说SQL 2008存在更多性能问题。”-什么问题?“但我听说SQL 2008存在更多性能问题。”-什么问题?
CREATE PROCEDURE [usp_Company_Search]
@KeywordNear as varchar(250),
@LocationNear as varchar(250) = null,
@PageIndex as int,
@Pagesize as int
AS
BEGIN
DECLARE @tbl TABLE
(
row int,
[Rank] int,
CompanyID int,
CompanyDesc text,
Title nvarchar(150),
Company nvarchar(150),
Category nvarchar(50),
Source nvarchar(50),
URI nvarchar(250),
Location varchar(60),
DateCreated nvarchar(50)
)
IF (@LocationNear is not null) BEGIN
WITH CompanySearch as
(
SELECT ROW_NUMBER() OVER (ORDER BY rs.rank desc) as row,
rs.Rank as [Rank],
J.CompanyID,
J.CompanyDesc,
J.Title,
J.Company,
J.Category,
J.Source,
J.URI,
J.Location,
J.DateCreated
FROM Company J
INNER JOIN
CONTAINSTABLE (Company,RawStripped, @KeywordNear) rs
ON J.Companyid = rs.[KEY] AND
CONTAINS (Location, @LocationNear)
)
insert into @tbl select * from CompanySearch
SELECT
CompanySearch.[Rank],
CompanySearch.CompanyID,
CompanySearch.CompanyDesc,
CompanySearch.Title,
CompanySearch.Company,
CompanySearch.Category,
CompanySearch.Source,
CompanySearch.URI,
CompanySearch.Location,
CompanySearch.DateCreated
FROM @tbl as CompanySearch
WHERE CompanySearch.row between (@PageIndex - 1) * @PageSize + 1 and @PageIndex*@PageSize
END
ELSE
BEGIN
WITH CompanySearch as
(
SELECT ROW_NUMBER() OVER (ORDER BY rs.rank desc) as row,
rs.Rank,
J.CompanyID,
J.CompanyDesc,
J.Title,
J.Company,
J.Category,
J.Source,
J.URI,
J.Location,
J.DateCreated
FROM Company J
INNER JOIN
CONTAINSTABLE (Company,RawStripped, @KeywordNear) rs
ON J.Companyid = rs.[KEY]
)
insert into @tbl select * from CompanySearch
SELECT
CompanySearch.Rank,
CompanySearch.CompanyID,
CompanySearch.CompanyDesc,
CompanySearch.Title,
CompanySearch.Company,
CompanySearch.Category,
CompanySearch.Source,
CompanySearch.URI,
CompanySearch.Location,
CompanySearch.DateCreated
FROM @tbl as CompanySearch
WHERE CompanySearch.row between (@PageIndex - 1) * @PageSize + 1 and @PageIndex*@PageSize
END
SELECT Max(row) as RecordCount from @tbl
select top 5 title, count(title) as cnt from @tbl group by title order by cnt desc
SELECT top 5 Location, count(location) as cnt from @tbl group by location order by cnt desc
SELECT top 5 Company, count(company) as cnt from @tbl group by company order by cnt desc
END