gpt4 book ai didi

database - SQLite - FROM 子句中的表顺序影响查询计划,为什么? (这里没有明确的加入)

转载 作者:搜寻专家 更新时间:2023-10-30 21:37:25 25 4
gpt4 key购买 nike

SQLite 数据库引擎的问题。我有一个相当复杂的问题,它在有向图中找到两组已知节点之间的路径,其中恰好有一个节点(准确地说,是公共(public)交通 route 的路径,但它具有图形表示)。

现在出乎意料的事情 - 没有明确的 JOIN 问题(只有 WHERE 子句中的条件),但是 FROM 子句中的表排序对查询计划影响很大。


For子句

from przystanek skad, przystanek dokad, linia l1, linia l2, przystanek posredni1, przystanek posredni2
from KNOWN_START_NODE, KNOWN_END_NODE, unknown_arc1, unknown_arc1, unknown_node_middle1, unknown_node_middle2

查询计划是:

TABLE linia AS l1 WITH INDEX linia_id_miasto
TABLE przystanek AS skad WITH INDEX przystanek_id_linia
TABLE linia AS l2 WITH INDEX linia_id_miasto
TABLE przystanek AS dokad WITH INDEX przystanek_id_linia
TABLE przystanek AS posredni1 WITH INDEX przystanek_id_linia
TABLE przystanek AS posredni2 WITH INDEX przystanek_linia_nrprzystanku

查询耗时0.14秒


For子句

from linia l1, linia l2, przystanek posredni1, przystanek posredni2, przystanek skad, przystanek dokad
from unknown_arc1, unknown_arc1, unknown_node_middle1, unknown_node_middle2, KNOWN_START_NODE, KNOWN_END_NODE

查询计划是:

TABLE linia AS l1 WITH INDEX linia_id_miasto
TABLE linia AS l2 WITH INDEX linia_id_miasto
TABLE przystanek AS posredni1 WITH INDEX przystanek_id_linia
TABLE przystanek AS posredni2 WITH INDEX przystanek_linia_nrprzystanku
TABLE przystanek AS skad WITH INDEX przystanek_id_linia
TABLE przystanek AS dokad WITH INDEX przystanek_id_linia

查询耗时4.90秒


为什么会有这样的差异?我读过 http://www.sqlite.org/optoverview.html但是没有关于 FROM 表排序的信息。我花了几个小时才找到性能不佳的原因,但我仍然不知道发生了什么。

这里是完整的问题,不是很清楚也没有表格卷,但仍然可以使用

select 
l1.nazwapliku,
l2.nazwapliku,
posredni1.nrprzystanku as nrposr,
skad.kolejnosc as k1a,
posredni1.kolejnosc as k1b,
posredni2.kolejnosc as k2a,
dokad.kolejnosc as k2b,
skad.nrprzystanku,
dokad.nrprzystanku

from przystanek skad, przystanek dokad, linia l1, linia l2, przystanek posredni1, przystanek posredni2
where

skad.nrprzystanku IN (1) AND
dokad.nrprzystanku IN (2) AND

l1.id_miasto = 1 AND
l2.id_miasto = 1 AND
l1._id <> l2._id AND
l1.nazwalinii <> l2.nazwalinii AND
posredni1._id<>posredni2._id AND

skad.id_linia = l1._id AND
posredni1.id_linia = l1._id AND
skad.kolejnosc<posredni1.kolejnosc AND

posredni1.nrprzystanku=posredni2.nrprzystanku AND
posredni2.id_linia = l2._id AND
dokad.id_linia = l2._id AND

posredni2.kolejnosc<dokad.kolejnosc

最佳答案

据我所知,SQLite 为查询优化做的小事主要取决于 WHERE 子句,通常第一个 WHERE 子句是获得最大 yield 的地方。

关于database - SQLite - FROM 子句中的表顺序影响查询计划,为什么? (这里没有明确的加入),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3338264/

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