2013-07-25 277 views
2

想知道是否有人可以帮助我。我有两张桌子。表A包含数百万行,我查看整个表,表B包含大约5万行,并且再次查看整个表。我使用下面的查询:SQL查询花费太长时间

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),尽管这可能会被RIGHT JOIN,除非我的逻辑完全错误。另外,如果我只能解释JOIN背后的逻辑 - table1中的数据列包含很多'stuff',并且其中的某个地方应该与t2.field3中的内容完全相同,例如, t1.data ='^ ABCD^00dasdas ^£ldasl32^XL0005 ^'和t2.field3将包含'XL0005'。

任何帮助表示赞赏。

感谢

+1

你的'WHERE'子句应该是'WHERE t1.ID <>''' –

+1

你使用哪个DBMS? MySQL Oracle DB2 .. – Joni

+0

如果速度是一个问题,你有什么索引在你的表上? – DaveRlz

回答

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“%” +柱+“%”或CHARINDEX操作做不要在涉及的列中使用任何索引。因此,如果你必须坚持特定的方法,你不应该期待巨大的进步。

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 
0

还可以将一些逻辑问题是您正在使用像,像真正的是性能杀手。

我更改查询请看看它是否解决了目的

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 & field3
试试这个。