PostgreSQL选择等于=的某些属性,而在SQL嵌套选择查询中选择小于<的属性

时间:2018-09-05 15:58:06

标签: sql postgresql

我写了一个已经运行了30分钟的SQL查询,但我认为它的格式不正确。

简化的数据库架构具有属性CompanyNameCustomerExpiryDateDeliveryDate

以下查询在选择所有出售给特定客户“ XYZ公司”的元组时效果很好:

(SELECT a.* FROM certificates a
WHERE (a."CompanyName", a."ExpiryDate") 
IN 
(SELECT b."CompanyName", b."ExpiryDate" 
FROM certificates b 
WHERE b."Customer" = 'Company XYZ') )

我想选择查询结果的子集,其中关系DeliveryDatea)的outer SELECT严格位于关系{{ 1}}(DeliveryDate)。

这可能没有任何逻辑意义,但是我必须找到在数据中b发生了更改的所有元组,因此这很关键。

这是我无法完成的查询:

inner SELECT

1 个答案:

答案 0 :(得分:0)

第一个查询是一个简单的查询,具有一个“独立子查询”。因此,在执行主查询之前,可以对该子查询进行充分的预处理(并且仅运行一次)。这样很快。

在第二种情况下,您有一个“相关子查询”。一个关联的子查询必须对主查询中的每个潜在行运行一次。这就是为什么这很慢。主表中的行越多,查询的速度就越慢。

相关子查询固有的速度要比不相关子查询慢。你能为这个做什么?尝试使用索引。一个简单的索引会有所帮助,而覆盖索引会使其更快。

  • 简单索引(快一些):

    create index ix1 on certificates ("Customer");
    

    “简单索引”包括与主表相关的列。

  • 覆盖索引(快得多):

    create index ix2 on certificates ("Customer", "DeliveryDate");
    

    “覆盖索引”包括查询在相关性,过滤和数据检索中使用的所有列。

好吧,最后,您需要尝试让他们看看他们对您的查询有多大改善。但是请记住,根据定义,相应的子查询自然很慢。