SQL连接并包含

时间:2018-07-26 22:06:46

标签: sql sql-server

我正在为此查询苦苦挣扎:

SELECT * 
FROM Transactions 
WHERE CustomerID IN (SELECT ID FROM Customers 
                     WHERE Name LIKE '%Test%')

运行需要10秒钟,但是,如果我通过获取子查询返回的4个值来手动创建查询,则它以毫秒为单位运行,例如:

SELECT * 
FROM Transactions 
WHERE (CustomerID = 1 OR CustomerID = 2 OR
       CustomerID = 3 OR CustomerID = 4)

为澄清起见,运行

SELECT ID FROM Customers WHERE Name LIKE '%Test%'

立即返回1,2,3,4值

有什么想法吗?我想念什么?

2 个答案:

答案 0 :(得分:0)

join会发生什么?

SELECT t.*
FROM Transactions t JOIN
     Customers c
     ON t.CustomerID = c.ID
WHERE c.Name Like '%Test%';

有时候,JOIN的优化要好于IN

答案 1 :(得分:0)

正如您已经说过的,当您拥有客户ID时,它会以毫秒为单位运行,因此,对客户名称的过滤是个问题。

这里怀疑第一个通配符(WHERE名称为'%Test%'),因为sql server需要像常规表达式一样读取name列中的所有字符串,并查找每个字符串中是否有“ Test”排在桌子上!

如果要过滤的名称始终以“ Test”开头,并且可以使用WHERE名称(例如“ Test%”),则效果会更好,因为sql server只需要读取每个字符串的开头。

编辑:

如果要尝试,这里的原始查询版本略有不同:

SELECT * FROM Transactions t
WHERE EXISTS (
    SELECT 1 FROM 
    Customers c
    WHERE c.ID = t.CustomerID 
    AND c.Name LIKE '%Test%'
)