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 JOIN
或LEFT 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
我有这个查询,它仅在作为 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 JOIN
或LEFT 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