没有一个索引可以满足此查询。这实际上意味着,你最好在创建两个索引,并运行两个查询,然后UNIONing结果...
1)InputBegin
创建索引 2)InputEnd
3创建单独指数)运行以下查询
SELECT * FROM yourTable WHERE InputEnd < ExclusionPeriodStart
UNION ALL
SELECT * FROM yourTable WHERE InputBegin > ExclusionPeriodEnd
第一个查询然后可以在InputEnd索引上使用范围查找。 第二个查询也可以使用范围查找,但是使用不同的索引。
通过保持查询独立,两个不同的要求不会相互干扰,并且可以使用最优化的索引。
您也已经知道(通过理解您的数据)结果中没有重叠(没有记录可以在结束之前开始,因此两个查询中都不会出现记录)。这意味着可以使用UNION ALL
代替较慢的UNION
。
据我所知,没有办法比这更快地执行此查询。 (在5米记录,它可能更快地只是扫描对小数据集整个表。)
编辑:这个回答假设你要查找不所有记录出现在一个固定的范围内。如果你想检查每个记录对每个其他记录,那么你需要一个不同的方法...
检查每个重叠是昂贵的。另外,如果你有这四个范围,制定出其删除是不可能的...
1 -->--> 4
3 -->--> 6
5 -->--> 8
7 -->--> 9
你应该删除范围1和3或2和4?
你可以做什么,是找到与他们有另一个范围重叠的所有范围。
,哪些是你不想要的是找到一个为B重叠,而B与A
SELECT
*
FROM
yourTable AS first_range
INNER JOIN
yourTable AS second_range
ON second_range.start_date >= first_range.start_date
AND second_range.start_date <= first_range.end_date
重叠这将necesarrily扫描整个表first_range。但是由于您只检查第二个范围的start_date,因此它可以在start_date索引中对任何冲突使用范围查找。
EDIT2:或者您可能需要第一个答案的对立面?
如果您希望做的所有范围与设定的范围发生碰撞,则对相同方法的修改将起作用。
SELECT * FROM yourTable WHERE InputEnd >= ExclusionPeriodStart
INTERSECT
SELECT * FROM yourTable WHERE InputBegin <= ExclusionPeriodEnd
但是,这可能不是很好。您将在query1中获取表格的百分比,并将其与几乎所有表格的其余部分相交。相反,你可以依靠简单的方法,但后来添加的优化...
SELECT
*
FROM
yourTable
WHERE
InputStart <= ExclusionPeriodEnd
AND InputEnd >= ExclusionPeriodStart
在第一个条件WHERE子句可以用一个范围来寻求解决,然后扫描所有的结果记录测试第二个条件。那么,我们是否可以缩小需要扫描的范围(currently (start of table) -> (ExclusionPeriodEnd))
。
我们可如果我们知道一个额外的一条信息:任何一个范围内的最大长度...
SELECT
*
FROM
yourTable
WHERE
InputStart <= ExclusionPeriodEnd
AND InputStart >= ExclusionPeriodStart - (maximumLength)
AND InputEnd >= ExclusionPeriodStart
现在前两个条件形成了一系列探索,并给要扫描最后一个条件的数据要小得多。
你怎么知道的最大lnegth关系吗?你可以扫描整个桌子,但这是一个自我挫败的尝试在优化。
相反,你可以索引一个计算的字段;一个给出范围的最大长度的计算。 SELECT MAX(calculatedField) FROM yourTable
然后避免扫描整个表格。或者你可以跟踪触发器。这对INSERTS来说很好,但是当你有一个DELETE时会变得更加混乱(如果你删除了最长的范围,你是否再次扫描整个表以找到新的最长范围?可能不是,你可能会试图保持旧的最大长度代替)。
当你说这些列有索引时,你可以指定它们是什么索引,因为它听起来像你有2个单独的索引。 – Ben 2012-04-12 13:22:41
@Ben他们只是列上的两个非唯一索引。 – Rnet 2012-04-12 13:26:04
您是否曾尝试在列('begin,end)'而不是每列'(begin)'和'(end)'上添加索引? – Ben 2012-04-12 13:27:57