如何加速sql左连接?
我有下表如何加速sql左连接?,sql,sqlite,left-join,Sql,Sqlite,Left Join,我有下表 lon, lat, heat 45,43,10, ...,...,..., 我想为所有(lon,lat)变量的唯一对分配一个唯一id。目前,我正在使用SqliteStudio执行以下操作: /* Stack the two SQL tables one on top of the other*/ CREATE table NewTable (lon REAL, lat REAL, heat REAL); INSERT INTO NewTable SELECT lon, lat,
lon, lat, heat
45,43,10,
...,...,...,
我想为所有(lon,lat)变量的唯一对分配一个唯一id。目前,我正在使用SqliteStudio执行以下操作:
/* Stack the two SQL tables one on top of the other*/
CREATE table NewTable (lon REAL, lat REAL, heat REAL);
INSERT INTO NewTable
SELECT lon, lat, heat FROM heat_1
UNION
SELECT lon, lat, heat FROM heat_2;
/* Associate unique id to lon, lat couples */
CREATE TABLE id_table (id_ integer primary key autoincrement, lon real, lat real);
INSERT INTO id_table(lon, lat) SELECT lon, lat FROM DataFrameStack GROUP BY lon, lat;
/*CREATE TABLE output*/
CREATE TABLE output_table AS
SELECT
NewTable.lon, NewTable.lat, heat, id_
FROM
NewTable
LEFT JOIN id_table ON
((NewTable.lon = id_table.lon) AND
(NewTable.lon = id_table.lon));
然而,问题是我有大量的行(以百万计),而且速度非常慢。实现此结果的最有效方法是什么?如果在sqlite 3.25.0版之后有sqlite版本,则可以执行以下操作:
CREATE TABLE output_table AS
SELECT
ROW_NUMBER() OVER(PARTITION BY lon, lat ORDER BY lon ASC) ROWNUM, lon, lat, heat
FROM
(SELECT lon, lat, heat FROM heat_1
UNION
SELECT lon, lat, heat FROM heat_2) Temp
您可以使用
densite\u rank()
:
我不知道为什么要涉及中间表。另外,
UNION
会减慢查询速度,因为它会导致删除重复项的开销。如果不需要删除重复项,请使用UNION-ALL
“ON”子句比较相同值对的两倍,这看起来像是一个bug。更重要的是,您是否在id_表中的lon和lat上引入了适当的索引?您是否知道UNION
花费资源删除任何重复项?但是,UNION ALL
没有(使它更快)?@MatBailie嗨,不,我没有。我会改进的!我每年可能会使用sql一到两次,所以我几乎不知道如何生活。。
SELECT DENSE_RANK() OVER (ORDER BY lon, lat) as id,
ll.*
FROM (SELECT lon, lat, heat FROM heat_1
UNION
SELECT lon, lat, heat FROM heat_2
) ll;