通常在 Oracle 或其他 SQL 数据库中最好使用 IN,因为不等于。优化器可以重写查询以使用索引来扫描值。
我很好奇它如何影响性能,因为在列上没有像 Oracle 那样的经典索引。
使用 <> 1 代替 IN (2,3,4) 会影响 Redshift 的性能吗?
这在很大程度上是一种“视情况而定”的情况。 Redshift 使用所有列上的元数据来了解哪些块包含哪些值范围。在处理大型表时,能够根据元数据从查询中排除数据是 Redshift 最强大的功能之一。因此,如果您正在针对具有(有效)元数据的列编写一个子句,该元数据有助于减少数据,那么一组因素就会发挥作用。如果没有那就再一套。
一般来说,像 A IN (2,3,4) 这样的肯定断言比像 A <> 1 这样的否定断言更好。Redshift 可以使用前者将元数据与这些值进行比较,并排除不能包含其中任何一个的块。它还可以使用 A <> 1,因为这是一个简单的情况,并删除所有只有值 1 的块。杀手不在,因为这通常需要对表进行全面扫描。
现在 Redshift 可以将长 IN 列表(我上次测试的 10 个或更多)转换为虚拟表并通过 INNER JOIN 实现相同的结果。这也会阻碍元数据检查,因此长 IN 列表也是一个潜在的问题。在这种情况下,<> 1 可能会更好。
如果您的元数据对减少表扫描没有帮助,那么差异可能会小得多。 Redshift 必须读取所有行并应用该子句。在这个级别上,这些之间没有太大区别。然而,长 IN 列表仍然可以创建 JOIN,这可能会慢一些。
就像我说的“这取决于”。