SQL查询耗时太长

时间:2013-07-25 07:44:33

标签: sql sql-server

想知道是否有人可以帮助我。我有两张桌子。表A包含数百万行,我查看整个表,表B包含大约5万行,再次,我查找整个表。我正在使用以下查询:

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

我使用正确连接的原因是因为,据我所知,它将从t2(我想要的)获取所有记录,并且只从t1获取与它们匹配的记录。此外,我已将'AND t1.ID = t2.ID'添加到SELECT语句中,因为我认为这会加快查询速度(不查找与t2中的ID不匹配的ID),尽管这可能会被否定正确的加入,除非我的逻辑是完全错误的。

另外,如果我可以解释JOIN背后的逻辑 - table1中的数据列包含很多“东西”,其中的某个地方应该与t2.field3中的内容完全相同,例如: t1.data ='^ ABCD ^ 00dasdas ^£ldasl32 ^ XL0005 ^'和t2.field3将包含'XL0005'。

感谢任何帮助。

由于

3 个答案:

答案 0 :(得分:0)

假设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

请记住,LIKE'%'+ Column +'%'或CHARINDEX等操作不会使用相关列中的任何索引。因此,如果你必须坚持使用特定的方法,你不应期待巨大的改进。

答案 1 :(得分:0)

如果在子查询中移动某些逻辑

,该怎么办?
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

答案 2 :(得分:0)

问题是你正在使用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

同时尝试将索引放在data&amp; field3列 试试这个。