SQL 服务器 LEFT JOIN 占用 5 秒

SQL Server LEFT JOIN taking up 5 seconds

我有这个查询,它仅在作为 LEFT JOIN 执行时提供我想要的结果。在某些情况下,它也可以用作 INNER JOIN,但根据反馈,LEFT JOIN 查询会提供更好的搜索结果。

很遗憾,最多需要 5 秒。即使直接在数据库上执行。

看看我的查询 - 是否有什么东西完全搞砸了,需要这么长时间?

SELECT 
    Kundendaten$.ID, Kundendaten$.firmenname1, Kundendaten$.firmenname2, 
    Kundendaten$.strasse, Kundendaten$.uid, Kundendaten$.lkw12t, 
    Kundendaten$.lkw3t, Kundendaten$.gesperrt, Kundentyp$.ext_kdnr, 
    Kundentyp$.Kundentyp_ID 
FROM 
    Kundendaten$ 
LEFT JOIN 
    Kundentyp$ ON Kundendaten$.ID = Kundentyp$.Kunden_ID 
WHERE 
    Kundentyp$.ext_kdnr LIKE '%ufo%' OR
    Kundendaten$.firmenname1 LIKE '%ufo%' OR 
    Kundendaten$.firmenname2 LIKE '%ufo%' OR 
    Kundendaten$.suchwort LIKE '%ufo%' OR 
    Kundendaten$.gehr_kundennummer LIKE '%ufo%' OR 
    Kundendaten$.kundenummer LIKE '%ufo%' OR 
    Kundendaten$.uid LIKE '%ufo%' OR 
    Kundendaten$.ID LIKE '%ufo%'
ORDER BY 
    Kundendaten$.ID ASC 
    OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY

如果要搜索此类数据,请尝试 Full-text search(FTS)

你还想要,那就试试这个,你可以在left join.. on...条件中添加你的where条件,比如

SELECT 
    Kundendaten$.ID, Kundendaten$.firmenname1, Kundendaten$.firmenname2, Kundendaten$.strasse, Kundendaten$.uid, Kundendaten$.lkw12t, Kundendaten$.lkw3t, Kundendaten$.gesperrt, Kundentyp$.ext_kdnr, Kundentyp$.Kundentyp_ID 
FROM Kundendaten$ 
 --this below condition, will filter the data first and then join and then where condition.
LEFT JOIN Kundentyp$ ON Kundendaten$.ID = Kundentyp$.Kunden_ID and  Kundentyp$.ext_kdnr LIKE '%ufo%' 
WHERE 
Kundendaten$.firmenname1 LIKE '%ufo%' OR 
Kundendaten$.firmenname2 LIKE '%ufo%' OR 
Kundendaten$.suchwort LIKE '%ufo%' OR 
Kundendaten$.gehr_kundennummer LIKE '%ufo%' OR 
Kundendaten$.kundenummer LIKE '%ufo%' OR 
Kundendaten$.uid LIKE '%ufo%' OR 
Kundendaten$.ID LIKE '%ufo%'
ORDER BY Kundendaten$.ID ASC OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY

When I used FTS

已更新

这是样本数据,检查一下。如果左 table 没有数据,它仍然从右 table.

获取全部数据
Declare @Kundendaten$  table (ID int , firmenname1 varchar(50), firmenname2 varchar(50), strasse varchar(50), uid int, lkw12t varchar(50), lkw3t varchar(50), gesperrt varchar(50))

insert into @Kundendaten$ values 
(1 , 'ufo1', '1', '2', 3, '4', '5' , '6' ),
(2 , 'uf2o', 'ufo1', '2', 4, '4', '5' , '6' ),
(3 , 'ufo3', '1', 'ufo2', 5, '4', '5' , '6' ),
(4 , 'ufo4', '1', '2', 6, '4', '5' , '6' ),
(5 , 'ufo5', '1', '2', 7, '4', '5' , '6' ),
(6 , 'abcd', '1', '2', 8, '4', '5' , '6' )

declare @Kundentyp$  table ( Kunden_ID int,ext_kdnr varchar(50), Kundentyp_ID int)
insert into @Kundentyp$ values 
(1 , 'ufo1' , 1 ),
(1 , 'ufo1' , 2 ),
(2 , 'uf2o' , 2 ),
(6 , 'abcd' , 2 ),
(5 , 'ufo5' , 2 )

--you can just execute without where condition to understand more that how LEFT JOIN work
select * 
FROM @Kundendaten$ k1 
LEFT JOIN @Kundentyp$ k2 ON k1.ID = k2.Kunden_ID and  k2.ext_kdnr LIKE '%ufo%' 
WHERE 
k1.firmenname1 LIKE '%ufo%' OR 
k1.firmenname2 LIKE '%ufo%' OR 
--k1.suchwort LIKE '%ufo%' OR 
--k1.gehr_kundennummer LIKE '%ufo%' OR 
--k1.kundenummer LIKE '%ufo%' OR 
k1.uid LIKE '%ufo%' OR 
k1.ID LIKE '%ufo%'

除了使用 LIKE 子句外,查询看起来很好。

使用INNER JOINLEFT JOIN取决于需求。正如@Edwin 指出的那样,使用 INNER JOIN 会减少扫描的记录数,因此它会比 LEFT JOIN.

更快

我在这里看到的问题是 LIKE 子句的过度使用。它永远不会使用任何索引搜索并使查询变慢。

如果像Kundendaten$.uid and Kundendaten$.ID这样的字段是数字数据类型,您可以使用精确搜索来查找它们。这将使用索引并使查询更快。

您可以用来提高查询性能的另一件事是通过使用 LIKE 搜索来限制要扫描的记录数,开头为:

Kundentyp$.ext_kdnr LIKE 'ufo%' OR
Kundendaten$.firmenname1 LIKE 'ufo%' OR 
Kundendaten$.firmenname2 LIKE 'ufo%' OR 
Kundendaten$.suchwort LIKE 'ufo%' OR 
Kundendaten$.gehr_kundennummer LIKE 'ufo%' OR 
Kundendaten$.kundenummer LIKE 'ufo%' OR 
Kundendaten$.uid = 1234  OR 
Kundendaten$.ID = 1234