繁体   English   中英

在sql表中通过100,000条记录进行通配符搜索的最佳优化技术是什么?

[英]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%'

由于主要业务依赖于搜索和选择项目,因此搜索需要非常快。

我想知道如何获得最佳性能。 搜索结果必须立即出现。

我试过的 -

  1. 我尝试将整个100,000条记录预加载到内存缓存中,然后从内存缓存中读取。 我试图避免每次搜索都调用SQL Server。

    这需要很多时间。 每次用户搜索项目时,我们都会从内存缓存中检索100,000条记录,然后进行搜索。 这比直接SQL搜索花费的时间多近2-3倍。

  2. 我尝试在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. 你的查询是cpu约束而不是IO
  2. itemName不会太长,以至于它包含所有字母和数字
  3. 该搜索词总共包含足够的选择性字符,而不仅仅是非常常见的字符
  4. 你的选择谓词受到%like%的限制

基本思想是扩展您的查询以帮助优化器知道哪些行需要类似的扫描。

步骤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谓词来减少评估的类似谓词。

笔记。

  1. 您可能需要强制优化器扫描trig_? 领域首先
  2. 索引可以帮助trig_? 字段,特别是在源表中
  3. 我没有展示如何处理大/小写,不要忘记处理这个
  4. 您可能会发现只需要做几个字母就可以了。
  5. 这种技术并不能为每种类似的使用提供性能提升,因此它不适用于任何使用类似设备的通用技术。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM