我遇到了以下数据库结构的挑战:
标题表大约是16000条记录。详细信息表每个标题表平均包含75条记录(总共120万条记录)。
我有一个源文档及其相关集(源集)。这个源集我想比较其他文档的集合(我称之为目标文档和集合)。通过我的应用程序,我有一个可用源集的ID列表,以及我可以直接在查询中使用的长度(在下面的示例中显示为46个元素的列表)。
每个目标文档需要的是源和目标集的交集长度(共享元素的数量)和差异的长度(源集中的内容的长度以及目标集中的内容的长度) )用于显示。我还需要一个过滤器来仅检索源和目标之间75%交叉的记录,与源集相比。
目前我有一个查询,它通过使用包含表达式的子选择来完成此操作,但它非常慢,并且结果需要在Web应用程序的页面刷新时可用。关键是我一次只需显示大约20个结果,但在对计算字段进行排序时,我需要计算每个目标记录,然后才能进行排序和分页。
查询是这样的:
select
DOC.id,
calc_subquery._calcSetIntersection,
calc_subquery._calcSetDifference
from
DOC
inner join
(
select
DOC.id as document_id,
(
select
count(*)
from
DOC_SET
where
DOC_SET.doc_id = DOC.id and
DOC_SET.element_id in (60,114,130,187,267,394,421,424,426,603,604,814,909,1035,1142,1223,1314,1556,2349,2512,4953,5134,6318,6339,6344,6455,6528,6601,6688,6704,6705,6731,6894,6895,7033,7088,7103,7119,7129,7132,7133,7137,7154,7159,7188,7201)
) as _calcSetIntersection
,46-(
select
count(*)
from
DOC_SET
where
DOC_SET.doc_id = DOC.id and
DOC_SET.element_id in (60,114,130,187,267,394,421,424,426,603,604,814,909,1035,1142,1223,1314,1556,2349,2512,4953,5134,6318,6339,6344,6455,6528,6601,6688,6704,6705,6731,6894,6895,7033,7088,7103,7119,7129,7132,7133,7137,7154,7159,7188,7201)
) as _calcSetDifference
from
DOC
where
DOC.id = 2599
) as calc_subquery
on
DOC.id = calc_subquery.document_id
where
DOC.id = 2599 and
_calcSetIntersection / 46 > 0.75;
我想知道是否:
无论如何,一些想法或解决方案真的很受欢迎。
亲切的问候, 埃里克