使用嵌套查询的 sqlite 查询性能

Posted

技术标签:

【中文标题】使用嵌套查询的 sqlite 查询性能【英文标题】:sqlite query performance using nested queries 【发布时间】:2015-06-06 04:08:38 【问题描述】:

我在 c# 中使用以下 sqlite 查询。该查询针对 100K 项进行迭代。我觉得执行速度很慢,通过优化查询可以提高速度

insert into salesmetrics(salesid, salesrankcount, volumerankcount, countsales,Avgsales) 
select @salesid,sum(salesrank), sum(volumerank), Count(salesrank), avg(salesrank) 
from (select salesrank, volumerank
      from salesindex
      Join SalesData on salesindex.salesindexID = salesData.salesindexID
      where SourceID = @Sourceid
        and Content like @content
      group by salesindex.salesindexID)

表格:

CREATE TABLE `salesindex` (
    salesindexID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    salesindex TEXT,
    SourceID INTEGER,
    salesrank INTEGER,
    volumerank INTEGER,
    dateAdded DATETIME, 
    UNIQUE(SourceID,dateAdded)
);

CREATE TABLE `SalesData` (
    SalesDataID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    salesindexID INTEGER,
    Content TEXT,
    dateAdded DATETIME,
    UNIQUE(salesindexID,content)
);

CREATE TABLE `salesmetrics` (
   salesmetricsID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
   salesID INTEGER,
   SalesRankCount INTEGER,
   VolumeRankCount INTEGER,
   countsales INTEGER,
   SalesRank  FLOAT
);

salesdata 表上的“content”索引和 salesindex 表上的 sourceid

【问题讨论】:

显示表定义,以及您拥有的所有索引。 我已编辑添加表结构和索引详细信息 【参考方案1】:

主要问题是内部查询中的 GROUP BY,显然需要它来压缩多个匹配的 SalesData 行。

改为使用Content 签入子查询:

SELECT @salesid,
       SUM(salesrank),
       SUM(volumerank),
       COUNT(salesrank),
       AVG(salesrank)
FROM salesindex
WHERE salesindexID IN (SELECT salesindexID
                       FROM SalesData
                       WHERE Content LIKE @content)
  AND SourceID = @Sourceid;

或者,根据Content 查找的选择性,最好将查找作为相关子查询进行:

SELECT @salesid,
       SUM(salesrank),
       SUM(volumerank),
       COUNT(salesrank),
       AVG(salesrank)
FROM salesindex
WHERE EXISTS (SELECT 1
              FROM SalesData
              WHERE salesindexID = salesindex.salesindexID
                AND Content LIKE @content)
  AND SourceID = @Sourceid;

【讨论】:

【参考方案2】:

除非我遗漏了什么,否则我认为您可以直接插入选择,而不是选择的选择:

insert into salesmetrics(salesid, salesrankcount, volumerankcount, countsales,Avgsales)
(select @salesid,sum(salesrank), sum(volumerank), Count(salesrank), avg(salesrank)
 from salesindex 
 Join SalesData on salesindex.salesindexID = salesData.salesindexID
 where SourceID = @Sourceid
   and Content like @content
 group by salesindex.salesindexID)

【讨论】:

我之前试过这个。我得到了多行。 这不是有效的 SQL。

以上是关于使用嵌套查询的 sqlite 查询性能的主要内容,如果未能解决你的问题,请参考以下文章

Sqlite Query, Group_Concat 的多个左连接和嵌套查询

使用嵌套循环提高 SQL 查询的性能 - PostgreSQL

使用 DELETE 逻辑不在嵌套查询中的最快性能 [重复]

嵌套结构如何影响 DocumentDB 查询性能?

带有嵌套查询(Django + React)的 Graphql 瓶颈性能使前端应用程序无法使用。请帮忙 :'(

mongodb 查询求助,嵌套数组里面查东西