Bry*_*yan 0 sql optimization select stored-procedures
在大型表上运行SELECT的存储过程超时.where子句导致超时,因为我只选择另一个表中的城市.
AND city IN (SELECT DISTINCT city from tOH where clientId = @clientId)
AND state IN (SELECT DISTINCT state from tOH where clientId = @clientId)
Run Code Online (Sandbox Code Playgroud)
*注意几乎总是只返回一个州
我试图将城市放入一个表格,然后使用该表格填充城市,但我收到一个错误,即没有声明@cities.
DECLARE @cities TABLE
(
city varchar(200)
);
INSERT INTO @cities (city) SELECT city FROM tOH WHERE clientId = @clientId GROUP BY city
Run Code Online (Sandbox Code Playgroud)
然后我的where子句改为
AND city IN (SELECT city from @cities)
Run Code Online (Sandbox Code Playgroud)
谁能想出一个优化这个存储过程的好方法?
----------------------------更新--------------------- ---------------
联接太慢了.我认为具有临时表或表变量的解决方案将起作用.
它不仅慢,而且不正确.
假设您的城市是"威斯康星州埃文斯维尔",但您的tOH桌子上只有"埃文斯维尔,IN"和"威斯康星州密尔沃基"的参赛作品.您目前单独检查城市和州的部分,因此您现有的查询将找到"Evansville"和"WI"的匹配项.它将允许这个城市,即使它真的不应该.
改为:
INNER JOIN
(
SELECT DISTINCT City AS tOHCity, State AS tOHState
FROM tOH
WHERE ClientID= @ClientID
) cs ON cs.tOHCity = city AND cs.tOHState = state
Run Code Online (Sandbox Code Playgroud)
请注意,子查询基于这样的假设:原始帖子中的DISTINCT是必需的,因为每个客户端可能在该表中具有多个相同的城市.如果不是这样,您可以直接加入该tOH表.
将它与正确的索引相结合,你应该是好的.