【问题标题】:sqlite query performance using nested queries使用嵌套查询的 sqlite 查询性能
【发布时间】: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

【问题讨论】:

  • 显示表定义,以及您拥有的所有索引。
  • 我已编辑添加表结构和索引详细信息

标签: sqlite query-optimization


【解决方案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。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 2016-01-31
    • 2016-12-25
    • 2015-08-05
    • 1970-01-01
    相关资源
    最近更新 更多