Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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
Sql 如何使用多个内部联接加快查询速度_Sql_Database_Ms Access_Sqlite - Fatal编程技术网

Sql 如何使用多个内部联接加快查询速度

Sql 如何使用多个内部联接加快查询速度,sql,database,ms-access,sqlite,Sql,Database,Ms Access,Sqlite,我一直在玩弄从ms access文件切换到SQLite文件来满足我简单的数据库需求;通常的原因是:更小的文件大小,更少的开销,开源等等 阻止我进行转换的一件事是SQLite中似乎缺乏速度。对于简单的SELECT查询,SQLite的性能似乎与MS Access一样好,甚至比MS Access更好。问题发生在具有多个内部联接语句的相当复杂的SELECT查询中: SELECT DISTINCT DESCRIPTIONS.[oCode] AS OptionCode, DE

我一直在玩弄从ms access文件切换到SQLite文件来满足我简单的数据库需求;通常的原因是:更小的文件大小,更少的开销,开源等等

阻止我进行转换的一件事是SQLite中似乎缺乏速度。对于简单的SELECT查询,SQLite的性能似乎与MS Access一样好,甚至比MS Access更好。问题发生在具有多个内部联接语句的相当复杂的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从命令提示符运行查询,都需要相同的时间

因此,我的问题如下:

  • SQLite只是没有优化以处理多个内部连接语句吗
  • 我是否在查询中做了一些明显愚蠢的事情(因为我是SQLite新手),使它变得如此缓慢
  • 在任何人提出完全不同的技术之前,不,我不能切换。我的选择是MS Access或SQLite.:)

    更新:
    为SQLite数据库中的每一列分配索引将查询时间从8分钟减少到6秒左右。感谢您解释为什么需要索引。

    您在引用完整性方面有问题吗?我这样问是因为我觉得您有不必要的连接,所以我将您的查询重新编写为:

    SELECT DISTINCT 
           t.[oCode] AS OptionCode, 
           t.[descShort] AS OptionDescription 
      FROM DESCRIPTIONS t
      JOIN tbl_D_H h ON h.[D] = t.[oCode]
                    AND h.[oType] = 'STANDARD'
      JOIN tbl_D_J j ON j.[D] = t.[oCode]
                    AND j.[oType] = 'STANDARD'
      JOIN tbl_Y_D d ON d.[D] = t.[oCode]
                    AND d.[Y] = '41'
                    AND d.[oType] ='STANDARD'
     WHERE t.[oMod] = 'D'
    

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


    MS Access非常积极地为列编制索引,而SQLite将要求您显式地创建所需的索引。因此,Access可能已经为您编制了[Description]或[D]索引,但SQLite中缺少这些索引。我没有在SQLite中进行如此多的JOIN活动的经验。我在一个Django项目中使用了它,数据量相对较少,没有检测到任何性能问题。

    如果描述和tbl\u D\E有多行扫描,那么oCode和D应该被索引。请看这里的示例,了解如何编制索引并告诉有多少行扫描()

    不过,这可能会解决问题

    使用BTREE创建索引ocode_描述索引(ocode); 使用BTREE在tbl_d_E(d)上创建索引d_INDEX

    等等


    正确索引是难题的一部分,它可以轻松地将查询速度提高一倍、三倍或更多

    @Phill Pafford:我没有在MS Access或SQLite数据上使用索引。我试图比较对sqlite的访问,因此我将两者的数据结构保持不变。无法发布答案,因此尝试发表评论:MS access非常积极地代表您为列编制索引,而sqlite将要求您显式创建所需的索引。因此,Access可能已经为您编制了[Description]或[D]索引,但SQLite中缺少这些索引。我没有在SQLite中进行如此多的JOIN活动的经验。我在一个Django项目中使用了它,数据量相对较小,没有检测到任何性能问题。Access中是否有索引?如果没有,我仍然认为这是一个公平的比较,并且仍然认为这两者都是相同的数据结构。相反,比较这两种产品,同时削弱一种产品,会有什么好处?@Larry Lustig:谢谢你提供的信息。我将尝试向SQLite数据添加索引,看看我得到了什么样的改进。Larry说得对,如果在表之间实现引用完整性,Jet/ACE会在连接的外键端创建隐藏索引。我认为他非常精明地立即将此视为性能差异的可能原因。@rexem:感谢您对查询的清理版本。我回去查看我的查询,结果发现我遗漏了几个WHERE语句,所以是的,我确实需要所有的连接。我仍然从你的回答中学到了一些有用的东西。谢谢Stewbob-如果这确实是答案,您应该将其标记为这样,以便rexem获得分数。他做了一些很好的工作来提供这个解决方案@马克:根据评论,拉里·卢斯蒂格提供了答案,但还没有回来把它作为获得学分的答案。