Sql 较低的WHERE条件导致了巨大的嵌套循环

Sql 较低的WHERE条件导致了巨大的嵌套循环,sql,lowercase,Sql,Lowercase,我有下面的查询,不同表中的电子邮件地址在不同的情况下,所以我需要比较小写和小写。但是使用lower()运行下面的查询要比不使用lower()运行慢1亿倍 有人能提出解决办法吗 SELECT person_oct.email, unsubs.unsubs_email FROM public.unsubs, public.person_oct WHERE lower(person_oct.email) = lower(unsubs.unsubs_email) AND

我有下面的查询,不同表中的电子邮件地址在不同的情况下,所以我需要比较小写和小写。但是使用lower()运行下面的查询要比不使用lower()运行慢1亿倍

有人能提出解决办法吗

SELECT 
  person_oct.email, 
  unsubs.unsubs_email
FROM 
  public.unsubs, 
  public.person_oct
WHERE 
  lower(person_oct.email) = lower(unsubs.unsubs_email) AND
  unsubs.unsubs_email IS NOT NULL  AND 
  unsubs.unsubs_email != '' AND 
  person_oct.email != '' AND 
  person_oct.email IS NOT NULL ;

在许多SQL Server中,默认情况下字符串比较不区分大小写。您可能不需要
lower()
调用


您也不需要查询的最后两行,因为它们隐含在where块的前三行中。

在许多SQL Server中,默认情况下字符串比较不区分大小写。您可能不需要
lower()
调用


您也不需要查询的最后两行,因为它们隐含在where块的前三行中。

您使用的是哪种DBMS?有无lower()的查询的完整执行计划是什么?通过在
lower()
上为这两个列添加索引,您应该能够改进这一点。此解决方案字符串操作可以阻止索引的使用。在SQL Server中,将列切换到不区分大小写的排序规则(并省略对
lower
)您正在使用的DBMS?有无lower()的查询的完整执行计划是什么?您应该能够通过在
lower()
上为这两个列添加索引来改进这一点。此解决方案字符串操作会阻止索引的使用。在SQL Server中,将列切换到不区分大小写的排序规则(并省略对
lower
)的调用。“多”是一种夸张。默认情况下,Postgres、DB2、Oracle、Firebird、Ingres、Informix、Vertica和Teradata都会进行区分大小写的字符串比较。我认为只有SQL Server(及其表兄Sybase)和MySQL没有使用POSTGRES,这起了作用。我最后只是更改了email=upper(email)列。有点欺骗,但完全不同。“很多”是一种夸张。默认情况下,Postgres、DB2、Oracle、Firebird、Ingres、Informix、Vertica和Teradata都会进行区分大小写的字符串比较。我认为只有SQL Server(及其表兄Sybase)和MySQL没有使用POSTGRES,这起了作用。我最后只是更改了email=upper(email)列。有点欺骗,但完全不同。