Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JDBC进行SQLite查询要比使用Firefox SQLItemManager插件慢得多_Sql_Sqlite_Jdbc_Sqlitemanager - Fatal编程技术网

使用JDBC进行SQLite查询要比使用Firefox SQLItemManager插件慢得多

使用JDBC进行SQLite查询要比使用Firefox SQLItemManager插件慢得多,sql,sqlite,jdbc,sqlitemanager,Sql,Sqlite,Jdbc,Sqlitemanager,我在Firefox的SqlItemManager插件中测试的查询有问题 这个特定的查询在Firefox插件中执行大约需要60毫秒,但是当我使用最新的Sqlite JDBC驱动程序在Java中使用相同的查询和相同的数据库时,执行需要惊人的3.7秒 Firefox插件通常比我的其他查询快一点(顶部快50毫秒,有时JDBC更快),但这可能是创建连接和将结果添加到列表中的开销,但是这个特定查询的性能差异非常可笑 以下是查询: SELECT p1.Id, p1.FirstName || ' ' || p1

我在Firefox的SqlItemManager插件中测试的查询有问题

这个特定的查询在Firefox插件中执行大约需要60毫秒,但是当我使用最新的Sqlite JDBC驱动程序在Java中使用相同的查询和相同的数据库时,执行需要惊人的3.7秒

Firefox插件通常比我的其他查询快一点(顶部快50毫秒,有时JDBC更快),但这可能是创建连接和将结果添加到列表中的开销,但是这个特定查询的性能差异非常可笑

以下是查询:

SELECT p1.Id, p1.FirstName || ' ' || p1.LastName AS PlayerName, sch1.LaneNum, l1.Name AS LeagueName, l1.Season, SUM(s1.Score) AS Series, e1.Date FROM Scores s1
JOIN SchedulePlayers sp1 ON  s1.SchedulePlayerId = sp1.Id
JOIN Schedules sch1 ON sp1.ScheduleId = sch1.Id
JOIN Players p1 ON sp1.PlayerId = p1.Id
JOIN TeamEncounters te1 ON sch1.TeamEncounterId = te1.Id
JOIN Encounters e1 ON te1.EncounterId = e1.Id
JOIN Leagues l1 ON e1.LeagueId = l1.Id

WHERE s1.GameNum < 4 AND l1.Name LIKE 'Juniors%' AND l1.Season = 2013 AND (sch1.LaneNum = 1 OR  sch1.LaneNum = 2) AND s1.IsBowlout = 0
GROUP BY p1.Id, l1.Id, e1.Id
ORDER BY Series DESC LIMIT 0,20
选择p1.Id,p1.FirstName | |“”| | | | p1.LastName作为玩家名称,sch1.LaneNum,l1.Name作为联盟名称,l1.station,SUM(s1.Score)作为系列,e1.从分数s1开始的日期
在s1.SchedulePlayerId=sp1.Id上加入SchedulePlayers sp1
sp1.ScheduleId=sch1.Id上的联接计划sch1
加入sp1.PlayerId=p1.Id上的玩家p1
在sch1.TeamEncounterId=te1.Id上加入TeamEncounters te1
JOIN在te1.EncounterId=e1.Id上遇到e1
加入e1上的联盟l1。联盟Id=l1.Id
其中s1.GameNum<4,l1.Name如'Juniors%'和l1.seasure=2013,(sch1.LaneNum=1或sch1.LaneNum=2)和s1.IsBowlout=0
按p1.Id、l1.Id、e1.Id分组
按系列说明订购限制0,20
显然,慢的部分是“像‘Juniors%”,但这并不能解释为什么它在Java中慢,而在插件中慢

如果我执行EXPLAIN查询计划,我会看到firefox插件对Leagues表使用以下索引:Columns:“seasure,Name,RealName”(RealName尚未在该查询中使用)

如果在Java中执行EXPLAIN查询计划,则用于Leagues表的索引是整数主键索引,我认为这就是问题所在

在java中,我运行上面的查询,然后使用相同的连接再运行两次相同的查询,但第二次用p1.Sex=1和p1.Sex=2替换像“Juniors%部分”这样的l1.Name。最后两个查询在这两种情况下都很快,这进一步证明问题来自l1.Name,比如“Juniors%”

我在所有表上都有主键,在所有需要它的列上都有外键。我还有许多其他索引,因为我从头开始重新设计旧数据库,因为有许多重复的字段,我决定添加索引以使其更快,但在这种情况下,我陷入了困境,特别是因为它在一种情况下有效,而在另一种情况下无效。是否可能是我对表的索引太过激进,使管理者更难选择正确的索引

请随意询问有关表、列、查询等的更多信息

编辑

Firefox插件使用SQLite 3.7.17,JDBC驱动程序使用SQLite 3.8.0。我尝试使用3.7.20 JDBC驱动程序(找不到3.7.17驱动程序的下载链接),但我遇到了相同的性能问题,而其他一些查询的性能更差,因此我切换回3.8.0

我编辑性能时间是因为我在基准测试时犯了一个错误:以前的时间是为了多次运行查询。因此,在Firefox中,执行一次查询大约需要60毫秒,而在Java中,执行一次查询需要3600毫秒,这是60倍多,这对于我的应用程序来说是不可接受的

以下是Java查询执行中的详细解释查询计划,其中列的顺序为:SelectId、order、from、Detail:

0 0 0 SEARCH TABLE Scores AS s1 USING INDEX idxScoresGameNumScore (GameNum<?)
0 1 1 SEARCH TABLE SchedulePlayers AS sp1 USING INTEGER PRIMARY KEY (rowid=?)
0 2 3 SEARCH TABLE Players AS p1 USING INTEGER PRIMARY KEY (rowid=?)
0 3 2 SEARCH TABLE Schedules AS sch1 USING INTEGER PRIMARY KEY (rowid=?)
0 0 0 EXECUTE LIST SUBQUERY 1
0 4 4 SEARCH TABLE TeamEncounters AS te1 USING INTEGER PRIMARY KEY (rowid=?)
0 5 5 SEARCH TABLE Encounters AS e1 USING INTEGER PRIMARY KEY (rowid=?)
0 6 6 SEARCH TABLE Leagues AS l1 USING INTEGER PRIMARY KEY (rowid=?)
0 0 0 USE TEMP B-TREE FOR GROUP BY
0 0 0 USE TEMP B-TREE FOR ORDER BY

0使用索引idxScoresGameNumScore(GameNum将表分数搜索为s1这些差异可能是由于不同的SQLite版本造成的。
(使用
选择sqlite_version();
进行检查)

阅读本手册。
在此特定查询中,您可以通过写入以下内容强制使用索引:

... JOIN Leagues l1 INDEXED BY MyThreeColumnIndex ON ...

谢谢你的回复,我很感激。我尝试过切换SQLite版本,但我也遇到了同样的问题。至于索引为[index]的版本,我也尝试过,但没有多大成功(它使用索引,但表搜索的顺序不一样,所以这似乎是另一个问题)。有关更多详细信息,请参阅我编辑的问题。我跳过了这一点,因为它提到要在未分析的数据库上执行此操作,但最终解决了我的问题。非常感谢!很好的链接:“optimizer checklist”。我遇到过类似的情况,Navicat中的查询运行速度很快(v3.7),而System.Data.SQLite(v3.8)中的查询速度很慢。我发现清单中的第4点起了作用:运行“分析”。出于某种原因,使用v3.8服务器访问文件的软件使用了错误的统计数据(查询时间~2分钟),而v3.7没有问题(查询时间~0.16秒)。
0 0 4 SCAN TABLE TeamEncounters AS te1 USING COVERING INDEX idxTeamEncounters
0 1 5 SEARCH TABLE Encounters AS e1 USING INTEGER PRIMARY KEY (rowid=?)
0 2 2 SEARCH TABLE Schedules AS sch1 USING INDEX sqlite_autoindex_Schedules_1 (TeamEncounterId=?)
0 0 0 EXECUTE LIST SUBQUERY 1
0 3 6 SEARCH TABLE Leagues AS l1 USING INTEGER PRIMARY KEY (rowid=?)
0 4 1 SEARCH TABLE SchedulePlayers AS sp1 USING COVERING INDEX idxSchedulePlayers (ScheduleId=?)
0 5 3 SEARCH TABLE Players AS p1 USING INTEGER PRIMARY KEY (rowid=?)
0 6 0 SEARCH TABLE Scores AS s1 USING INDEX sqlite_autoindex_Scores_1 (SchedulePlayerId=? AND GameNum<?)
0 0 0 USE TEMP B-TREE FOR GROUP BY
0 0 0 USE TEMP B-TREE FOR ORDER BY
... JOIN Leagues l1 INDEXED BY MyThreeColumnIndex ON ...