SQL是否比单独查找更有效?

SQL是否比单独查找更有效?,sql,Sql,例如,在下面的查询中 SELECT * FROM Persons WHERE LastName IN ('Hansen','Pettersen', 'Smith') 假设LastName已编制索引,单个查询是否比对LastName执行三个单独的查询更有效?执行单个查询比运行多个查询检索相同数量的数据更快,因为这样可以节省网络往返次数。根据我的经验,在多查询场景中,往返次数通常是性能的最大杀手 与具有三个条件的单个查询相比,如下所示 SELECT * FROM Persons WHERE Las

例如,在下面的查询中

SELECT * FROM Persons
WHERE LastName IN ('Hansen','Pettersen', 'Smith')

假设LastName已编制索引,单个查询是否比对LastName执行三个单独的查询更有效?

执行单个查询比运行多个查询检索相同数量的数据更快,因为这样可以节省网络往返次数。根据我的经验,在多查询场景中,往返次数通常是性能的最大杀手

与具有三个条件的单个查询相比,如下所示

SELECT * FROM Persons
WHERE LastName='Hansen' OR LastName='Pettersen' OR LastName='Smith'

不同的是:大多数优化器发现它与查询中的
相同,所以性能保持不变。

如果在列中创建索引,则会影响性能。。 可以对任何外键列使用非聚集索引

这对你有帮助

尝试实现几个类似这样的查询,有些是带索引的,有些是不带索引的。。
你会知道不同之处。

在这个特定的案例中,答案可能是肯定的:正如DEM所说:

1次网络往返而不是3次,1次解析开销而不是3次,1次索引行程而不是3次

但一般情况并非如此。示例:

  • 有些数据库不允许在
    in
    子句中使用任意数量的元素。甲骨文将您的权限限制为1000。因此,即使在一个查询中执行会更快,也不能总是这样
  • 如果
后面的表达式是子查询,则可以更快地运行该子查询,在应用程序中处理结果,并使用值列表构建第二个查询(通常是因为索引和/或类型转换问题)

简短的回答是肯定的(1次网络往返而不是3次,1次解析开销而不是3次,1次索引行程而不是3次)。但问题真的可能是;你自己测试过吗?[不要只相信别人的答案,我可能是错的;测试、验证、使用不可靠的证据;)]关于元素限制的观点很好,但在一条语句中使用子查询通常比将子查询作为单独的查询运行要快(至少对于具有良好查询优化器的DBMS来说),正如我所说的:“它可以更快”但这并不总是正确的,与直觉相反。在某些情况下,优化器会生成一个完全没有大脑的计划(比如做两次完整的表扫描,而不是将子查询的五个结果读入一个临时表并进行连接)。两次完整的表扫描实际上可能比使用临时表和连接更快。您指的是哪些数据库管理系统?我不认为我在Oracle或PostgreSql中见过这种行为,我在Oracle和DB2中见过这种情况。在Oracle的例子中,问题是在一个表中,列类型是
DATE
,而在子查询中,返回了
TIMESTAMP
。在这种情况下,Oracle决定忽略现有索引,而是扫描表(所有1.2亿行)。啊!隐式类型转换的危险——总是有利于糟糕的计划。如果要比较的值不属于同一类型,则几乎没有任何DBMS会对列使用索引。如果您将子查询改为返回日期(例如使用
cast
),我打赌该计划会更好。