想知道是否有人可以帮助我。我有两张桌子。表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'。
感谢任何帮助。
由于
答案 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
列
试试这个。