Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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 - Fatal编程技术网

Sql 如何使此更新查询更高效

Sql 如何使此更新查询更高效,sql,sqlite,Sql,Sqlite,我正在使用SQLite3。 有人知道如何使这个查询更有效吗? 本质上,我有一个表,在其中插入一些具有给定InsertDate的记录。 该表可能已经包含与新插入的记录重复的4个其他字段。我想更新所有这些副本中的某个字段 为了找到重复的行,为了清晰起见,我使用了这个查询标识符 SELECT Table1.rowid FROM Table1 INNER JOIN ( SELECT Field1, Field2, Field3, Field4, InsertDate

我正在使用SQLite3。 有人知道如何使这个查询更有效吗? 本质上,我有一个表,在其中插入一些具有给定InsertDate的记录。 该表可能已经包含与新插入的记录重复的4个其他字段。我想更新所有这些副本中的某个字段

为了找到重复的行,为了清晰起见,我使用了这个查询标识符

SELECT Table1.rowid
FROM   Table1 
INNER JOIN
      (
       SELECT Field1, Field2, Field3, Field4, InsertDate
       FROM Table1
       WHERE InsertDate = '2013-07-11' 
       ) AS T
ON
       T.Field1 = Table1.Field1
   AND T.Field2 = Table1.Field2
   AND T.Field3 = Table1.Field3
   AND T.Field4 = Table1.Field4

WHERE Table1.InsertDate <> T.InsertDate  --(could use WHERE Table1.InsertDate <> '2013-07-11')
使用字段1、2和3上的索引运行select查询需要6秒有趣的是,我发现在字段4上有索引会将时间增加到9秒,所以我没有索引

然后,我在update查询中使用该查询,通过在update语句ie中的in子句后面添加select来决定更新哪些记录

UPDATE Table 1
SET Field 5 = 'A'
WHERE Table1.RowID IN

    -- here comes the original select query
    (
    SELECT Table1.rowid
    FROM   Table1 
    INNER JOIN
       (
       SELECT FIELD1, Field2, Field3, Field4, InsertDate
       FROM Table1
       WHERE InsertDate = '2013-07-11' 
       ) AS T
    ON
        T.Field1 = Table1.Field1
    AND T.Field2 = Table1.Field2
    AND T.Field3 = Table1.Field3
    AND T.Field4 = Table1.Field4

    WHERE Table1.InsertDate <> T.InsertDate
    )
但这需要将近25秒的时间来运行

我试着用初始选择创建一个临时表,打算在更新查询中使用它,但也花了大约25秒来创建这个表,所以看起来不像是实际的更新减慢了速度,它似乎在使用我的6s选择查询和“in”

通常我会更新大约300000行中的9000行


任何改进此查询的建议都将非常受欢迎。

如果我正确理解了逻辑,您不需要rowid:


然后,在table1field1、field2、field3、field4、insertdate和table1insertdate上创建一个索引。

谢谢,这似乎会把它放到4s
UPDATE Table 1
    SET Field 5 = 'A'
    WHERE InsertDate <> '2013-07-11' and
          EXISTS (select 1
                  from table1 tt
                  where tt.InsertDate = '2013-07-11' and
                        T.Field1 = tt.Field1 and
                        T.Field2 = tt.Field2 and
                        T.Field3 = tt.Field3 and
                        T.Field4 = tt.Field4        
                 );