SQL .. 其中列中的常量

  • 本文关键字:常量 SQL mysql sql styles
  • 更新时间 :
  • 英文 :


像这样查询有什么错误吗:

select * from category_cross_selling
where 'SOMEID' in (f_categories_from, f_categories_to);

而不是这样?

select * from category_cross_selling
where f_categories_from = 'SOMEID' or f_categories_to = 'SOMEID';

我有时会这样做,但我不知道这是不好的做法,还是破坏了MySQL的优化器引擎,或者我不知道,但是人们告诉我停止这样做。

我喜欢它,因为很明显它是我在任何列中寻找的相同 id,并且您不会重复常量,从而避免错误。

编辑: 请注意,我问这个问题的原因是,通常在IN搜索中,您将列放在左侧,将 N 个常量放在右侧

由于这两种语法都有效,因此不将您的版本与运算符in一起使用的唯一原因是or版本的性能是否更好。我每次都会测试两个版本,看看哪个赢了。

两者应该具有相同的性能 - 这并不好(我稍后会谈到)。in版本的优点是更短,不易出错,所以不要被它迷惑。

编写查询的最高性能方法可能是:

select *
from category_cross_selling
where f_categories_from = 'SOMEID'
union all
select *
from category_cross_selling
where f_categories_from <> 'SOMEID' and -- may need to take `NULL` into account
f_categories_to = 'SOMEID';

此版本可以利用category_cross_selling(f_categories_from)category_cross_selling(f_categories_to, f_categories_from)上的索引。 两个索引都是必需的,每个索引用于其中一个子查询。

启用在查询下方运行的统计信息。

SET STATISTICS IO ON;
SET STATISTICS TIME ON;

现在单击"包括实际执行计划"(或 Ctrl+M)。现在同时运行这两个查询。您将能够在执行计划部分中查看这两个查询的实际执行计划和估计执行计划。另请查看消息部分,了解已完成多少次逻辑读取和其他部分。由此,您可以看到这些查询的差异计划是什么。如果两者相同,则完全没有区别。

更新

我已经在两个查询的执行计划的参数部分中看到了表扫描的属性,并发现即使您在(f_categories_from,f_categories_to)中编写"SOMEID",SQL引擎也会将其转换为内部f_categories_from = "SOMEID"或f_categories_to = "SOMEID",如下所示。所以根本没有区别。

对于 (f_categories_from, f_categories_to) 中的"SOMEID":

参数:对象:([数据库].[德博]。[TestTable]), WHERE:('SOMEID'=[TestTable].[f_categories_to] 或 'SOMEID'=[TestTable]。[f_categories_from])

对于f_categories_from = 'SOMEID' 或 f_categories_to = 'SOMEID':

参数:对象:([数据库].[德博]。[TestTable]), WHERE:([TestTable].[f_categories_from]='SOMEID' OR [TestTable]。[f_categories_to]='SOMEID')

相关内容

  • 没有找到相关文章

最新更新