Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.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_Sqlite_Left Join - Fatal编程技术网

如何加速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;