[英]What is the best optimization technique for a wildcard search through 100,000 records in sql table
我正在研究ASP.NET MVC应用程序。 该应用程序由200个用户使用。 这些用户经常(每5分钟)从100,000个项目列表中搜索项目(此列表每月将增加1-2%)。 此100,000个项目的列表存储在SQL Server表中。
搜索是通配符搜索
例如:
Select itemCode, itemName, ItemDesc
from tblItems
Where itemName like '%SearchWord%'
由于主要业务依赖于搜索和选择项目,因此搜索需要非常快。
我想知道如何获得最佳性能。 搜索结果必须立即出现。
我试过的 -
我尝试将整个100,000条记录预加载到内存缓存中,然后从内存缓存中读取。 我试图避免每次搜索都调用SQL Server。
这需要很多时间。 每次用户搜索项目时,我们都会从内存缓存中检索100,000条记录,然后进行搜索。 这比直接SQL搜索花费的时间多近2-3倍。
我尝试在SQL Server表上进行直接搜索,但一次只将结果限制为50条记录(使用前50名)
这似乎还不错,但仍然没有 - 我们正在寻求的表现附近
我想听听可能的解决方案和任何文章/代码的链接。
提前致谢
运行SQL事件探查器并执行调整配置文件。 这将针对要对您的数据库执行的索引提出建议。
此外,如下所示的查询值得一试。
SELECT *
FROM
(
SELECT ROW_NUMBER() OVER ( ORDER BY ColumnA) AS RowNumber, itemCode, itemName, ItemDesc
FROM tblItems
WHERE itemName LIKE '%FooBar%'
) AS RowResults
WHERE RowNumber >= 1 AND RowNumber < 50
ORDER BY RowNumber
编辑:更新了查询以反映您的真实场景。
如果没有前导通配符作为主搜索进行搜索怎么样....
Where itemName like 'SearchWord%'
然后有一个“更多结果”按钮加载
Where itemName like '%SearchWord%'
(或者排除第一个结果集的结果)
Where itemName not like 'SearchWord%' and itemName like '%SearchWord%'
一个奇怪的替代品可能会起作用,因为它取决于几个假设等。抱歉没有完全解释但是使用ipad很难打字。 (是的,此解决方案已用于高txn商业系统)
这假定
基本思想是扩展您的查询以帮助优化器知道哪些行需要类似的扫描。
步骤1.设置表格
为每个字母/数字创建额外的26或36列。 当我真的完成它时,它一直是一个单独的表,但把它放在源表上对于像100k这样的小体积应该没问题。 让我们调用colmns trig_a,trig_b等。
为每个插入/编辑/删除创建一个触发器,如果它包含'a',则将1或0放入trig_a字段,对所有26/36列执行此操作。 执行此操作的触发器很复杂,但可能(至少使用Oracle)。 如果你遇到困难我肯定会有人创造它,或者我可以把它挖出来。
此时,我们有一系列列,指示字段是否包含字母/数字等。
第2步。帮助您查询
通过这些额外信息,我们可以帮助优化者。 将以下内容添加到您的查询中
Select ... Where .... And
((trig_a > 0) or (searchword not like '%a%')) and
((trig_b > 0) or (searchword not like '%b%')) and
... Repeat for all columns monitored...
如果优化器表现出来,它可以使用(希望)较低成本字段> 0谓词来减少评估的类似谓词。
笔记。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.