在我解释我的问题之前,我想分享一些有关上下文的信息。
系统 我们有一个网站,用于记录来自许多目的地的用户的门票。我们有1370个活跃用户,1012个目的地。每天,他们记录约3万张门票,而此时我们共有10637019张门票。每张票平均有三个位置。
在系统中,我们还为每张票保存客户,当我们想要记录新票时,我们从列表中选择一个特定客户,或者我们创建一个新客户。目前,我们拥有3763787个客户,每天我们可以节省4500个新客户。
服务器 我们有两台服务器,一台用于网站,另一台用于数据库。我们使用Microsoft技术,这意味着我们拥有IIS7和SQL Server 2008 R2。数据库服务器有6个CPU 2.9GHz,8 GB RAM。
问题 当我们想要为新票证选择一个客户端时,我们遇到了这个问题。我们正在使用具有自动完成功能的Web控件来选择它。自动完成过程使用基于客户端全名的全文索引在数据库服务器上运行。每个月都会填充全文索引。
我们有以下形式的查询:
select
clientId
,name
,lastName
,fullName (calculated column in the clients table)
,gender
,birthDate
,type
from clients
where contains(fullName, '"Carl*" AND "Gari*"')
此查询使用服务器中63%的CPU资源,我们希望减少该数量。
我们如何才能提高性能呢?是否有使用SQL Server 2008 R2自动完成搜索的替代方法?
提前致谢,
答案 0 :(得分:1)
我最初的评论,我假设计算机全名与FirstName +''+ LastName类似 - 你可以使查询名字如'Carl%'和姓氏如'Gari%'收集信息。谢谢你回答。
我自己没有尝试过这个问题(只关注你的环境),但你可以在基于包含的查询中添加like子句,并将查询计划与包含版本进行比较。
有3种可能的查询显而易见的查询
A Contains version -- your existing query
A Like Version -- as I commented
A Combined version -- using like and contains
我认为使用全索引搜索总是比LIKE版本更快是不对的,因为我认为正确的答案是,这取决于。
如果您在姓氏(或名字)上有索引,“喜欢”版本应该进行索引查找。这取决于您的密钥分配和匹配百分比。即,如果仅使用姓氏上的索引,则搜索像“G%”这样的姓氏,并且搜索“Carl%”等名字而不是“Gari%”和“Carl%”等名字会慢得多。因此,如果您有足够长的搜索键,则LIKE版本可能比包含版本更快。您必须进行测试才能确定最有效的方法。
组合版本可能始终是最佳选择,或者至少足够好。但在遵循下面的策略之前,我肯定会先尝试这个。
我建议的整体策略是:
停止使用增量搜索,直到用户输入至少几个字符为止 - 您可能会因为这样做而付出很多性能,因为它对您网站的用户几乎没有任何实际价值。作为建议,在输入至少3个字符之前不要进行增量搜索。由于您没有提到在增量搜索之前已经确实需要最少的字符。
如果这被否决,则采用相同的基本策略,但是直到自输入的最后一个字符或输入的数字字符后的NN毫秒失效时才调用增量搜索>一定的长度。事实上,由于一些姓氏只有2个字符,所以你几乎必须在现实中使用这个策略。
同样,只要用户快速输入新字符以避免用户未使用的浪费搜索,我就不会进行任何增量搜索,无论长度如何。
除非组合查询总是足够好,否则在服务器上有两个不同的存储过程来回传搜索结果,一个是类似版本,另一个是包含版本。根据提供的名称大小,调用期望的版本以获得最佳结果。