我正在为此查询苦苦挣扎:
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值
有什么想法吗?我想念什么?
答案 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%'
)