首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IN操作符对SQL查询性能的影响有多大?

IN操作符对SQL查询性能的影响有多大?
EN

Stack Overflow用户
提问于 2011-06-24 01:23:11
回答 5查看 12.9K关注 0票数 1

我的SQL查询需要9个小时才能执行。如下所示:

代码语言:javascript
运行
复制
Select Field1, Field2
From A
Where Field3 IN (45 unique values here) 

当我将这个查询拆分成3个完全相同的查询时,每个查询在IN子句中都有15个值,每个查询都需要2分钟的执行时间。因此,我现在花了6分钟(3个查询*2分钟),而不是花费9个小时。

有没有人能解释一下,为什么在IN子句中,只有值的数量不同的相同查询会花费如此多的时间来运行?

EN

回答 5

Stack Overflow用户

发布于 2011-06-24 01:32:01

  • 您使用的是什么数据库引擎(Oracle、SQL Server、MySQL等)?
  • 您可以发布这两个查询的查询计划吗?

听起来您的数据库正在使用的优化器为第一个查询选择了一个非常糟糕的执行计划。假设您的数据库引擎使用某种基于成本的优化器(大多数大型供应商都是这样做的),这通常意味着优化器对返回多少行的猜测是完全不正确的。最有可能的情况是,无论指定了15个或45个唯一值,优化器的估计都是同样不正确的,但是将错误估计值增加三倍会导致优化器相信一个不同的查询计划是合适的。通常,这意味着您向优化器提供的有关表A的统计信息是不正确的,需要修复。

也就是说,表A有多大?如果您真的是从单个表进行查询,那么优化器需要考虑的选项相对较少。它实际上只需要在A上执行全表扫描和在Field3上使用索引。即使它决定进行表扫描,而不是在Field3上使用索引,也不可能花9个小时来扫描单个表,除非在非常特殊的情况下,表A至少是以数百GB为单位测量的,并且硬件相对简单。

票数 2
EN

Stack Overflow用户

发布于 2011-06-24 01:34:59

你有没有试过使用EXISTS

代码语言:javascript
运行
复制
 Select Field1, Field2 From A Where
 EXISTS (SELECT NULL FROM B Where
 B.value = A.Value )
票数 2
EN

Stack Overflow用户

发布于 2011-06-24 01:34:01

我可以看到两种可能性:

1)可能有十亿条Field3 = 10001的记录,所以速度会很慢。而且可能没有包含其他值的记录,所以这会非常快。

2)问题可能是数据库用来运行查询的方法。例如,可能会有一个截止点,在那里它可能会从使用索引切换到全表扫描。优化器并不总是正确的。当它错了的时候,你必须绕过它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6458096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档