sql - 如何使用多个 INNER JOIN 加速查询

标签 sql database ms-access sqlite

为了满足简单的数据库需求,我一直在尝试从 ms-access 文件切换到 SQLite 文件;出于通常的原因:较小的文件大小、较少的开销、开源等。

阻止我进行转换的一件事是 SQLite 似乎缺乏速度。对于简单的 SELECT 查询,SQLite 的性能似乎与 MS-Access 一样好,甚至更好。带有多个 INNER JOIN 语句的相当复杂的 SELECT 查询会出现此问题:

SELECT DISTINCT 
       DESCRIPTIONS.[oCode] AS OptionCode, 
       DESCRIPTIONS.[descShort] AS OptionDescription 
FROM DESCRIPTIONS 
INNER JOIN tbl_D_E ON DESCRIPTIONS.[oCode] = tbl_D_E.[D] 
INNER JOIN tbl_D_F ON DESCRIPTIONS.[oCode] = tbl_D_F.[D] 
INNER JOIN tbl_D_H ON DESCRIPTIONS.[oCode] = tbl_D_H.[D] 
INNER JOIN tbl_D_J ON DESCRIPTIONS.[oCode] = tbl_D_J.[D] 
INNER JOIN tbl_D_T ON DESCRIPTIONS.[oCode] = tbl_D_T.[D] 
INNER JOIN tbl_Y_D ON DESCRIPTIONS.[oCode] = tbl_Y_D.[D] 
WHERE ((tbl_D_E.[E] LIKE '%') 
        AND (tbl_D_H.[oType] ='STANDARD') 
        AND (tbl_D_J.[oType] ='STANDARD') 
        AND (tbl_Y_D.[Y] = '41') 
        AND (tbl_Y_D.[oType] ='STANDARD') 
        AND (DESCRIPTIONS.[oMod]='D'))

在 MS-Access 中,此查询的执行时间约为 2.5 秒。在 SQLite 中,它需要 8 个多一点的分钟。无论我是从 VB 代码运行查询还是从使用 sqlite3.exe 的命令提示符运行查询,都需要相同的时间。

所以我的问题如下:

  1. 难道 SQLite 没有针对处理多个 INNER JOIN 语句进行优化吗?
  2. 我是否在我的查询中做了一些明显愚蠢的事情(因为我是 SQLite 的新手)导致它如此缓慢?

而且在任何人提出完全不同的技术之前,不,我不能切换。我的选择是 MS-Access 或 SQLite。 :)

更新: 为 SQLite 数据库中的每一列分配一个索引将查询时间从 8 多分钟减少到大约 6 秒。感谢Larry Lustig用于解释为什么需要索引。

最佳答案

根据要求,我将我之前的评论重新发布为实际答案(当我第一次发布评论时,出于某种原因我无法将其作为答案发布):

MS Access 非常积极地代表您为列建立索引,而 SQLite 将要求您显式创建所需的索引。因此,Access 可能已为您编制了 [Description] 或 [D] 索引,但 SQLite 中缺少这些索引。我没有在 SQLite 中处理那么多 JOIN 事件的经验。我在一个数据量相对较小的 Django 项目中使用它,没有发现任何性能问题。

关于sql - 如何使用多个 INNER JOIN 加速查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1561302/

相关文章:

php - 从 php 生成 pdf(必须从 mysql 数据库中检索)

ms-access - 在 MS Access 中为外键设置默认值或设置为空

sql - 如何比较 2 个字段并返回每条记录的最小值?

sql - 使用 iis 托管 .net 核心应用程序会出现数据库访问错误

c# - 发送 16 位数字到 SQL 数据库

mysql - MySQL 中 'SET' 两个表之间的多列更新

MYSQL:如何统计表上的性别和年龄类别

c# - MS Access 互操作性 - 数据导入

sql - 在 PostgreSQL 上使用特定值更新所有受影响的行

mysql - 插入查询优化