缓存?多个可选过滤器

时间:2017-02-06 20:48:53

标签: performance caching search ibm-midrange db2-400

我试图找出一个大型查询的选项,考虑到它的作用,这需要花费一些时间,但需要花费一些时间。它有许多连接,必须针对最多预定义数量的参数进行搜索。其中一些参数值是预定义的(选择框),而一些是自由格式的文本框(不幸的是LIKE带有前缀和后缀的通配符)。返回的数据集很大,过滤器选项很可能经常更改。结果集的顺序也由用户控制。此外,用户访问权限必须仅限于用户有权使用的结果。此授权作为基线WHERE子句的一部分处理,无论选择哪种过滤器,都应用该子句。

我并不是真的在寻找查询优化建议,因为我已经审核了查询,并且根据我的要求检查/优化了查询计划。我对查询优化后的替代解决方案更感兴趣。除了试图将查询分解成单独的较小位(遗憾的是这不是一个可接受的解决方案)之外,我只能想到两个选项。但是,我认为他们不适合这种情况。

  1. 我首先想到了缓存,但我认为它不可行 关于过滤器变化的可能性以及返回的大数据集的可能性。
  2. 根据我的研究,ElasticSearch和Solr等选项不会是 正确适合,因为数据集可以操作我的多个程序,这些数据存储很快就会过时。
  3. 是否还有其他选项可以改善具有这些要求的搜索功能的感知性能?

1 个答案:

答案 0 :(得分:0)

您没有提供有关表格和查询的足够信息以获取具体解决方案。

正如@jmarkmurphy在评论中所提到的,DB2和IBM我自己做了“缓存”。我同意在处理大量不同的结果集时,你不太可能改进它。但您需要确保使用IBM提供的功能。例如,如果使用RPGLE中嵌入的SQL,请确保没有set option CLOSQLCSR=*ENDMOD。另请检查您正在使用的QAQQINI中的设置。

您已经提到过使用Visual Explain并构建一些请求的索引。这是一个好的开始。但是,当查询在生产中运行时,请密切关注计划缓存,索引使用情况和建议的索引。

最后,您提到您正在使用LIKE '%SOMETHING%'进行全表扫描。同样,如果没有所涉及的列和数据的详细信息,则可以猜测可能有用的内容。正如我的评论中所建议的,Omnifind for IBM i可能是一种改进。

但是,Omnifind 并且改进了LIKE。 Omnifind旨在处理语言搜索。来自文章i Can … Find a Needle in a Haystack using OmniFind Text Search Server for DB2 for i

SELECT story_id FROM story_library.story_table 
WHERE CONTAINS(story_doc, 'blind mouse') = 1;
  

此查询结果将包含我们期望从典型搜索引擎获得的匹配项。搜索不区分大小写,搜索词的语言变化将匹配。换句话说,先前的查询将指示包含“盲小鼠”的文档的匹配。以类似的方式,搜索“坏狼”将返回包含“大坏狼”的文档。