我有一个查询,当我添加一个增加的where部分时,它会变得非常慢
它本质上只是一个对varchar(500)字段的类似查找
哪里..。
and (xxxxx.yyyy like '% blahblah %')
我一直在绞尽脑汁,但当我添加这段代码时,查询速度变得非常慢。
我想知道是否有人在更改字段类型、索引设置或索引提示方面有建议,或者其他可能有帮助的建议。
感谢您的帮助。
sql 2000企业版。
以下是一些附加信息:
糟了。不幸的是,作为一些背景知识,我确实需要(在like语句的情况下)将%放在前面。这背后有我无法回避的业务逻辑。
自那以后,我在该字段上创建了一个全文目录,并将搜索转换为使用contains语法。
不幸的是,虽然这有时提高了性能,但对于新词搜索来说,它似乎很慢(更慢)。所以如果我有苹果..苹果似乎在随后的几次搜索中速度更快,但在新的橙色搜索中却并非如此(例如)。
所以我不认为我能接受(除非你能建议做一些修补以使其更一致)。
其他信息:
该表仅包含大约60k条记录,我尝试过滤的字段是windows server 2003上的varchar(500) SQL2000
我正在使用的查询绝对是复杂的
抱歉,我不得不更换专有的东西..但是应该给你一个查询的提示:
SELECT TOP 99 AAAAAAAA.Item_ID, AAAAAAAA.CatID, AAAAAAAA.PID, AAAAAAAA.Description,
AAAAAAAA.Retail, AAAAAAAA.Pack, AAAAAAAA.CatID, AAAAAAAA.Code, BBBBBBBB.blahblah_PictureFile AS PictureFile,
AAAAAAAA.CL1, AAAAAAAA.CL1, AAAAAAAA.CL2, AAAAAAAA.CL3
FROM CCCCCCC INNER JOIN DDDDDDDD ON CCCCCCC.CID = DDDDDDDD.CID
INNER JOIN AAAAAAAA ON DDDDDDDD.CID = AAAAAAAA.CatID LEFT OUTER JOIN BBBBBBBB
ON AAAAAAAA.PID = BBBBBBBB.Product_ID INNER JOIN EEEEEEE ON AAAAAAAA.BID = EEEEEEE.ID
WHERE
(CCCCCCC.TID = 654321) AND (DDDDDDDD.In_Use = 1) AND (AAAAAAAA.Unused = 0)
AND (DDDDDDDD.Expiry > '10-11-2010 09:23:38') AND
(
(AAAAAAAA.Code = 'red pen') OR
(
(my_search_description LIKE '% red %') AND (my_search_description LIKE '% nose %')
AND (DDDDDDDD.CID IN (63,153,165,305,32,33))
)
)
AND (DDDDDDDD.CID IN (20,32,33,63,64,65,153,165,232,277,294,297,300,304,305,313,348,443,445,446,447,454,472,479,481,486,489,498))
ORDER BY AAAAAAAA.f_search_priority DESC, DDDDDDDD.Priority DESC, AAAAAAAA.Description ASC您可以看到,抛出的my_search_description筛选器还包括一个dddd.cid筛选器(业务逻辑)。
这就是减慢速度的部分(从1.5-2秒的页面加载下降到6-8秒的加载(哇))
这可能是我缺乏对如何使用全文搜索目录的理解。
答案给我留下了深刻的印象,所以如果任何人有任何建议,我将是最伟大的。
发布于 2010-10-13 00:43:31
如果尚未启用全文索引,请启用全文索引。
不幸的是,在查询上使用LIKE子句确实会降低速度。据我所知,全文索引确实是提高速度的唯一方法(当然,代价是存储空间)。
这里有一个指向Full-Text Search in SQL Server概述的链接,它将向您展示如何配置内容和更改查询以利用全文索引。
发布于 2010-10-13 00:47:23
更多细节当然会有帮助,但是...
全文索引当然很有用(取决于有关表和查询的更多详细信息)。全文索引在设置和查询方面都需要一些额外的工作,但这是尝试有效地执行搜索的唯一方法。
以通配符开头的LIKE的问题在于,SQL server必须执行完整的表扫描才能找到匹配的记录-它不仅必须扫描每一行,而且还必须读取您正在查询的基于字符的字段的内容。
不管有没有全文索引,有一件事可能会有帮助:是否可以缩小搜索行的范围,这样SQL至少不需要扫描整个表,而只需要扫描其中的一些子集?
发布于 2010-10-13 00:44:17
'% blahblah %‘是一个提高性能的问题。将通配符放在开头将告诉SQL Server,字符串可以以任何合法字符开头,因此它必须扫描整个索引。如果你必须使用这个过滤器,你最好的办法就是专注于你的其他过滤器来改进。
https://stackoverflow.com/questions/3917005
复制相似问题