2

想知道是否有人可以帮助我。我有两张桌子。表 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 中获取与它们匹配的记录。另外,我在 SELECT 语句中添加了“AND t1.ID = t2.ID”,因为我认为这会加快查询速度(不查找与 t2 中的 ID 不匹配的 ID),尽管这可能会被否定正确的加入,除非我的逻辑完全错误。

另外,如果我能解释一下 JOIN 背后的逻辑——table1 中的数据列包含很多“东西”,其中某处应该正是 t2.field3 中的内容,例如 t1.data = '^ABCD^00dasdas ^£ldasl32^XL0005^' 和 t2.field3 将包含 'XL0005'。

任何帮助表示赞赏。

谢谢

4

3 回答 3

0

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

data也尝试在&field3列上放置索引
试试这个。

于 2013-07-25T08:09:03.403 回答
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 之类的操作不使用相关列中的任何索引。因此,如果您必须坚持特定方法,则不应期望有巨大的改进。

于 2013-07-25T07:59:56.623 回答
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
于 2013-07-25T08:01:37.743 回答