我的SQL查询需要9个小时才能执行。如下所示:
Select Field1, Field2
From A
Where Field3 IN (45 unique values here) 当我将这个查询拆分成3个完全相同的查询时,每个查询在IN子句中都有15个值,每个查询都需要2分钟的执行时间。因此,我现在花了6分钟(3个查询*2分钟),而不是花费9个小时。
有没有人能解释一下,为什么在IN子句中,只有值的数量不同的相同查询会花费如此多的时间来运行?
发布于 2011-06-24 01:32:01
听起来您的数据库正在使用的优化器为第一个查询选择了一个非常糟糕的执行计划。假设您的数据库引擎使用某种基于成本的优化器(大多数大型供应商都是这样做的),这通常意味着优化器对返回多少行的猜测是完全不正确的。最有可能的情况是,无论指定了15个或45个唯一值,优化器的估计都是同样不正确的,但是将错误估计值增加三倍会导致优化器相信一个不同的查询计划是合适的。通常,这意味着您向优化器提供的有关表A的统计信息是不正确的,需要修复。
也就是说,表A有多大?如果您真的是从单个表进行查询,那么优化器需要考虑的选项相对较少。它实际上只需要在A上执行全表扫描和在Field3上使用索引。即使它决定进行表扫描,而不是在Field3上使用索引,也不可能花9个小时来扫描单个表,除非在非常特殊的情况下,表A至少是以数百GB为单位测量的,并且硬件相对简单。
发布于 2011-06-24 01:34:59
你有没有试过使用EXISTS?
Select Field1, Field2 From A Where
EXISTS (SELECT NULL FROM B Where
B.value = A.Value )发布于 2011-06-24 01:34:01
我可以看到两种可能性:
1)可能有十亿条Field3 = 10001的记录,所以速度会很慢。而且可能没有包含其他值的记录,所以这会非常快。
2)问题可能是数据库用来运行查询的方法。例如,可能会有一个截止点,在那里它可能会从使用索引切换到全表扫描。优化器并不总是正确的。当它错了的时候,你必须绕过它。
https://stackoverflow.com/questions/6458096
复制相似问题