我写了一个已经运行了30分钟的SQL查询,但我认为它的格式不正确。
简化的数据库架构具有属性CompanyName
,Customer
,ExpiryDate
和DeliveryDate
。
以下查询在选择所有出售给特定客户“ 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') )
我想选择查询结果的子集,其中关系DeliveryDate
(a
)的outer SELECT
严格位于关系{{ 1}}(DeliveryDate
)。
这可能没有任何逻辑意义,但是我必须找到在数据中b
发生了更改的所有元组,因此这很关键。
这是我无法完成的查询:
inner SELECT
答案 0 :(得分:0)
第一个查询是一个简单的查询,具有一个“独立子查询”。因此,在执行主查询之前,可以对该子查询进行充分的预处理(并且仅运行一次)。这样很快。
在第二种情况下,您有一个“相关子查询”。一个关联的子查询必须对主查询中的每个潜在行运行一次。这就是为什么这很慢。主表中的行越多,查询的速度就越慢。
相关子查询固有的速度要比不相关子查询慢。你能为这个做什么?尝试使用索引。一个简单的索引会有所帮助,而覆盖索引会使其更快。
简单索引(快一些):
create index ix1 on certificates ("Customer");
“简单索引”包括与主表相关的列。
覆盖索引(快得多):
create index ix2 on certificates ("Customer", "DeliveryDate");
“覆盖索引”包括查询在相关性,过滤和数据检索中使用的所有列。
好吧,最后,您需要尝试让他们看看他们对您的查询有多大改善。但是请记住,根据定义,相应的子查询自然很慢。