SQL查询耗时太长

SQL查询耗时太长,sql,sql-server,Sql,Sql Server,不知道有没有人能帮我。我有两张桌子。表A包含数百万行,我查找整个表,表B包含大约50000行,我再次查找整个表。我正在使用以下查询: SELECT t1.ID as [ID], count(*) as [Total] FROM table1 t1 RIGHT JOIN table2 t2 ON t1.data LIKE '%' + t2.field3 + '%' AND t1.ID = t2.ID WHERE t1.ID not LIKE '' GROUP BY t1.ID, t1.datet

不知道有没有人能帮我。我有两张桌子。表A包含数百万行,我查找整个表,表B包含大约50000行,我再次查找整个表。我正在使用以下查询:

SELECT t1.ID as [ID], count(*) as [Total]
FROM table1 t1
RIGHT JOIN table2 t2 ON t1.data LIKE '%' + t2.field3 + '%'
AND t1.ID = t2.ID

WHERE t1.ID not LIKE ''
GROUP BY t1.ID, t1.datetime
我使用right join的原因是,据我所知,它将获取t2中我想要的所有记录,并且只获取t1中与之匹配的记录。另外,我在SELECT语句中添加了'AND t1.ID=t2.ID',因为我认为这会加快查询速度,不会查找与t2中的ID不匹配的ID,尽管这可能会被正确的连接否定,除非我的逻辑完全错误

另外,如果我能解释连接背后的逻辑,那么表1中的数据列包含很多“东西”,其中的某个地方应该正好是t2.field3中的内容,例如t1.data='^ABCD^00dasdas^ ldasl32^XL0005^',t2.field3将包含'XL0005'

感谢您的帮助


多谢

假设ID列已编制索引,这可能会执行得更好一些:

SELECT 
  t1.ID as [ID], count(*) as [Total]
FROM 
  table2 t2
  INNER JOIN table1 t1 ON t2.ID=t1.ID AND t1.ID <> ''
WHERE CHARINDEX(t2.field3, t1.data) > 0
GROUP BY t1.ID, t1.datetime

还请记住,诸如“%”+列+“%”或CHARINDEX之类的操作不会在相关列中使用任何索引。因此,如果您必须坚持使用特定的方法,就不应该期望有巨大的改进。

如果您在子查询中移动一些逻辑会怎么样

SELECT t1.ID as [ID], count(*) as [Total]
FROM (select t1.ID as [ID]
            ,t1.datetime as [DATETIME]
            ,t1.data as [DATA]
            ,t2.field3 as [FEILD3] table1 t1
             RIGHT JOIN table2 t2 ON t1.ID = t2.ID
      HAVING FIELD2 is not null AND DATA LIKE '%' + FIELD3 + '%') as t1

WHERE t1.ID not LIKE ''
GROUP BY t1.ID, t1.datetime

问题是你正在使用Like,Like是真正的性能杀手

我已经更改了查询,请查看它是否解决了问题

SELECT ID,
       COUNT(*)
       (SELECT t.*,
               CHARINDEX(t1.data,t2.field3) PRESENT
          FROM table1 t1
         RIGHT JOIN table2 t2 
            ON t1.ID = t2.ID)TEMP
 WHERE ID <> '' 
   AND PRESENT > 0
 GROUP BY ID, datetime
还可以尝试在数据和字段3列上放置索引
试试这个。

您的WHERE子句应该是WHERE t1.ID,您使用哪种DBMS?MySQL Oracle DB2..如果速度是个问题,那么表上有哪些索引?我使用的是SQL Server。我将尝试WHERE子句更改和执行计划建议。您应该使用一个或多个表将数据dbo.table1.data解析/提取为关系格式,然后在不使用此谓词t1.data的情况下连接所有这些表,例如“%”+t2.field3+“%”,这太可怕了。更多,比如“%SomeChars%”不是SARGable。因此,dbo.table1.data上的索引对您帮助不大。