SQL查询耗时太长
不知道有没有人能帮我。我有两张桌子。表A包含数百万行,我查找整个表,表B包含大约50000行,我再次查找整个表。我正在使用以下查询: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
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上的索引对您帮助不大。