使用一个计划优化的静态查询
项目描述
简介
虽然 Zope 中的目录工具非常有用,但我们已经看到,在大型 Plone 网站中使用额外索引和大量内容时,出现了一些缓慢。
目录实现使用 BTree 集合操作,如并集、多并集和交集。这些操作相当快,特别是在所有内容都在内存中时。然而,目录实现相当简单,导致在相当大的集合上进行大量集合操作。
查询计划
搜索引擎和数据库使用查询优化器来选择查询计划,以便尽早最小化结果集,因为处理大量数据耗时。
我们想要做的是首先针对索引进行搜索,给出最小的结果集。但是,为了使其有用,我们需要将结果传递给索引,以便索引能够尽早内部限制结果集。在计算路径搜索时,如果门户类型索引已经将可能的结果限制为 10000,就没有必要查看所有 150000 个结果。如果我们已经将结果限制为 10000 个,所有集合操作都将显著加快。
我们通过搜索的索引列表来识别不同的搜索。如果没有特定索引集的查询计划,则像正常一样运行查询,同时存储每个索引的结果数。当检查完所有索引后,列表根据结果数排序并存储为查询计划。下次在相同的索引上搜索时,将查找查询计划。
为了为类似查询提供不同的查询计划,可以提供额外的虚假索引名称。这些名称将被目录忽略,但将成为密钥的一部分。对于只有少量不同值的索引,查询值也将成为密钥的一部分。这些类型的索引通常具有不均匀的索引键到值的分布。例如,一个网站可能有很少的 待处理 文档,但有很多 已发布 的文档。
测试
为了测试,将 monkey 补丁导入其他测试中,如 CMFPlone
import experimental.catalogqueryplan
并运行测试。
开发
此项目的开发地点为:https://github.com/Jarn/experimental.catalogqueryplan
变更日志
3.2.8 - 2013-01-07
从 ExtendedPathIndex 3.0.1 迁移 ExtendedPathIndex 修复。[mike.rhodes, hannosch]
3.2.7 - 2011-08-23
从 ZCatalog 迁移 c122666,修复批处理限制的第二部分的早期部分。[davisagli, hannosch]
3.2.6 - 2011-08-21
从 e.btree 迁移:更新到 Cython 0.15。[hannosch]
从 e.btree 迁移:如果只有一个参数是树集合,则纠正大小/大赋值。[hannosch]
从 e.btree 迁移:如果两个参数都不是树集合,则避免交集优化。[hannosch]
3.2.5 - 2011-05-27
从 Products.CMFPlone 迁移 c50071,修复批处理处理。[hannosch]
从 ZCatalog 迁移 c121708,修复如果任何 LazyCat 已被展平,则添加两个 LazyCat 的问题。[hannosch]
3.2.4 - 2011-04-27
如果只提供了 b_start 而没有 b_size,则在 sortResults 方法中修复可能的 TypeError。[hannosch]
3.2.3 - 2011-04-10
指定支持的 Python 版本。[hannosch]
3.2.2 - 2011-04-09
从 ZCatalog 迁移 c121349,优化日期范围索引以添加地板和天花板日期。在此版本中,它是硬编码值。[hannosch]
从 ZCatalog 迁移 c121191,修复日期范围索引优化的边缘情况。[hannosch]
3.2.1 - 2011-03-16
指定 Plone 3.2.x 系列的最低要求为 >= 4.0.3。[hannosch]
3.2.0 - 2011-03-08
修复了 PloneBatch.__getitem__ 以支持新的限制批量结果。 [hannosch]
从 ZCatalog 2.13.4 迁移了排序/批量改进。 [hannosch]
更新到 Cython 0.14.1。 [hannosch]
避免使用 Python 2.5 中引入的相对导入语法。 [hannosch]
3.1.0 - 2010-12-27
添加了基于批量参数的自动排序限制计算。如果查询包含 b_start 和 b_size 参数,并且没有提供显式的 sort_limit,则排序限制将被计算为 b_start + b_size。 [hannosch]
从其 2.13.2 版本迁移了 Products.ZCatalog.Lazy 的改进。
更新到 Cython 0.14。 [hannosch]
3.0.2 - 2010-09-28
在 daterangeindex 中减去逆集,因为这通常比范围内的内容集(如 effectiveRange)小得多。 [tesdal]
3.0.1 - 2010-09-24
更新到 Cython 0.13。 [hannosch]
确保修补我们自己的目录模块中的交集函数。根据导入时间顺序的影响,我们可能会得到标准交集函数,这对参考目录执行非常糟糕。 [hannosch]
3.0 - 2010-05-13
修复了测试,以与最新的 Zope 2.12 版本兼容。 [hannosch]
3.0a3 - 2010-03-08
扩展了存储查询计划格式,以便可选地包含值索引集。这也使得手动影响集合成为可能。 [hannosch]
更改了交集算法,以避免计算树集合的长度,因为这会导致对所有桶的扫描。与大型树集合的集合比提高了 10 倍,而与小型集合和小型树集合的集合则慢了 50%。 [hannosch, tesdal]
扩展性能测试,以检查小型树集合。 [hannosch]
3.0a2 - 2010-02-21
将此包标记为 Plone 插件。 [hannosch]
3.0a1 - 2010-02-21
更新到 Cython 0.12.1。 [hannosch]
重新引入了在 1.6 中删除的请求缓存。Catalog.getCounter() 是键的一部分。 [tesdal]
当连接结果集时,如果可能,使用优化交集而不是未优化的 weightedIntersection。 [tesdal]
合并了来自 querytree-cython 分支的工作。我们现在完全可选的基于 Cython 的 C 优化。 [hannosch]
将性能测试移动到常规测试包,并在测试级别 2 中提供。 [hannosch]
将测试移动到子包中。 [hannosch]
2.1 - 2009-11-19
将修补移动到初始化方法中,并在测试中导入 ZopeTestCase。这避免了在 Zope 2.12 中的导入错误。 [hannosch]
2.0 - 2009-11-10
添加了名为 catalogqueryplan-prioritymap 的浏览器视图,以便方便地将当前查询计划作为 Python 模块导出,并支持使用 CATALOGQUERYPLAN 环境变量再次加载它。 [witsch]
1.9 - 2009-11-06
对最近优化的更多修复。ZCatalog API 太灵活了。 [hannosch]
1.8 - 2009-11-06
修复了 1.7 版本中引入的优化。我们还需要查看请求的表单参数以查找查询限制。 [hannosch]
1.7 - 2009-10-17
在处理查询时,不要询问索引其不实际上属于查询的限制。 [hannosch]
在目录模块中添加了一个 DEFAULT_PRIORITYMAP 钩子。这允许提供默认优先级映射字典以初始化优先级映射,使用预计算的或手动设计的优先级映射。 [hannosch]
1.6 - 2009-09-10
删除了日期范围索引的每个请求缓存。如果数据更改,这可能导致同一请求期间后续查询的无效结果。 [hannosch]
1.5 - 2009-07-27
确保始终将原始查询中找到的所有索引包含在查询计划中。否则,如果我们最初得到的查询恰好对某个索引没有限制,则该索引将不再被查询。现在我们至少将索引作为查询计划的一部分保留。真正的解决方案是像unimr.catalogqueryplan中所做的那样,持续更新查询计划的结果长度。[hannosch]
1.4 - 2009-05-20
在慢查询报告中添加了详细的每个索引时间记录。现在您除了总时间外,还可以得到每个索引花费的时间。[hannosch]
加快了常见的KeywordIndexes,如portal_type和allowedRolesAndUsers。提供一个小型传递的结果集和一个或查询,我们将它与索引中的每个集合相交,然后稍后合并它们。对这些类型索引进行直接多并集通常会产生接近整个目录大小的集合。[hannosch]
受unimr.catalogqueryplan的启发,添加了慢查询的可选记录功能。[hannosch]
添加了一种机制来指示索引的类型,其查询值在构建优先级图时应该被考虑。通过VALUETYPES提供了一种类似ADVANCEDTYPES的自愿机制。例如,对review_state的查询与对pending和published项的查询不同,因为它们通常分布非常不均。[hannosch]
1.3 - 2009-03-15
将日志消息更改为调试级别。[hannosch]
1.2 - 2009-03-03
不要将request.request作为更新的一部分使用,因为它往往会触发浏览器id (_ZopeId) [tesdal]
确保UnIndex始终返回IISet,而不是int。[tesdal]
只有当有超过2个集合时才对交集集合进行排序,否则顺序无关紧要 [tesdal]
为修补程序添加了记录功能 [swampmonkey]
1.1 - 2009-01-02
将set monkeypatches临时化,以避免zc.relationship尝试持久化集合方法。[tesdal]
1.0 - 2009-01-02
删除了冗余的交集,并在差异中添加了类型检查 [tesdal]
添加了替代的加权交集,并重用了BTree测试 [tesdal]
不要对交集进行monkeypatch,因为zc.relationship会尝试序列化函数。添加了新的ExtendedPathIndex代码。[tesdal]
优化UnIndex.apply_index内部的UnIndex,为AND排序集合,为OR使用多并集。[tesdal]
限制交集中的if语句数量,并添加了查找最大和最小值最快方法的测试。[tesdal]
Monkeypatch difference以处理Python中的大/小差异。这不属于查询计划,因为它只是一个BTree修补程序,并且应该被重构。[tesdal]
添加了性能测试。[tesdal]
修复了UnIndex返回结果缺少索引ID的bug [tesdal]
为交集添加了测试,修复了第二个参数集合为空时的bug [tesdal]
Monkeypatch intersect以处理Python中的大/小交集 [tesdal]
改进了UnIndex查询,以避免冗余的交集 [tesdal]
明确了LanguageIndex的支持。我们现在缺少回退支持,并且现在当启用回退时禁用优化。[hannosch, mj]
0.9 - 2008-10-18
添加了对LinguaPlone的LanguageIndex的支持。[hannosch]
0.8 - 2008-09-03
让每个索引修补程序将自己注册到ADVANCEDTYPES列表中。这应该能够使其他索引的修补程序成为可能,并消除对ExtendedPathIndex的依赖。[tesdal]
0.7 - 2008-08-22
在检索缓存数据之前检查是否应该使用daterangeindex。[tesdal]
0.6 - 2008-07-03
使用一个易变的实例变量来存储优先级图。[mj]
0.5 - 2008/06/23
DateRangeIndex不应该覆盖apply_index方法传入的半请求。[mj]
0.4 - 2008/06/23
DateRangeIndex现在不再假设REQUEST可用。[tesdal]
0.3
处理请求为字典。[tesdal]
0.3
将修补程序重构到多个文件中。[tesdal]
基于对相同索引的查询的结果集分析进行动态查询优化。[tesdal]
基于典型使用模式进行手动查询优化。[tesdal]
0.1
初始发布
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪一个,请了解更多关于 安装包 的信息。
源代码分发
实验 catalogqueryplan-3.2.8.zip 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0684577979d4108eb8d13f3240d7483489ba5b0b6c2160a53a3c8caf07ba50f5 |
|
MD5 | 9a47cd7cb359a3d72b860908ae06949c |
|
BLAKE2b-256 | 22b531255e429b0621bb287edbf6c7ea32ec3b9e6b0d6103afd5a1b31154ddcc |