gpt4 book ai didi

sql - 进行更有效的连接

转载 作者:行者123 更新时间:2023-12-04 22:37:27 25 4
gpt4 key购买 nike

这是我的查询,它相当简单:

SELECT
INVOICE_ITEMS.II_IVNUM, INVOICE_ITEMS.IIQSHP
FROM
INVOICE_ITEMS
LEFT JOIN
INVOICES
ON
INVOICES.INNUM = INVOICE_ITEMS.II_INNUM
WHERE
INVOICES.IN_DATE
BETWEEN
'2010-08-29' AND '2010-08-30'
;

我对 SQL 的了解非常有限,但我正在尝试理解一些概念,例如子查询等。我不是要重新设计这段代码,而是要解释为什么它这么慢(在我的测试数据库上超过 600 秒)以及我如何使它更快。

根据我的理解,左连接正在创建一个虚拟表并用连接的每个结果行填充它,这意味着它正在处理每一行。我将如何阻止查询完全读取表格并找到 WHERE/BETWEEN子句,然后创建一个虚拟表(如果可能的话)?

我的逻辑如何?是否有任何一致推荐的资源让我进入 SQL 忍者状态?

编辑:感谢大家的快速和礼貌的回应。目前,我通过 ODBC 连接到名为 OMNIS 的快速应用程序开发框架中使用的专有数据库。因此,我真的不知道正在运行什么样的优化,但我相信它是基于 MSSQL 的。

最佳答案

我会像这样重写它,并确保你在 i.INNUM 上有一个索引。 , ii.INNUM , 和 i.IN_DATE . LEFT JOIN正在变成 INNER JOIN通过您的 WHERE条款,所以我改写为:

SELECT ii.II_IVNUM, ii.IIQSHP 
FROM INVOICE_ITEMS ii
INNER JOIN INVOICES i ON i.INNUM = ii.II_INNUM
WHERE i.IN_DATE BETWEEN '2010-08-29' AND '2010-08-30'

根据您使用的数据库,可能发生的是来自 INVOICE_ITEMS 的所有记录。正在加入(由于 LEFT JOIN ),无论是否与 INVOICE 匹配与否,然后 WHERE子句过滤到匹配的日期在范围内的那些。通过切换到 INNER JOIN ,您可以使查询更高效,只需将 WHERE 子句应用于 INVOICES具有匹配 INVOICE_ITEMS 的记录记录。

关于sql - 进行更有效的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3636941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com