SQLite数据库引擎的问题。我有一个相当复杂的问题,它在两组已知节点之间的有向图中找到路径,其间只有一个节点(确切地说,是公共传输路径中的路径,但它有图形表示)。
现在出现意外情况 - 没有明确的JOIN问题(只有WHERE子句中的条件),但FROM子句中的表排序对查询计划有很大的影响。
对于条款
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秒
对于条款
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
答案 0 :(得分:0)
AFAIK,小SQLite用于查询优化主要依赖于WHERE子句,通常第一个WHERE子句是获得最大收益的地方。