使用嵌套查询的 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