存储过程SQL优化

存储过程SQL优化,sql,sql-server-2008,Sql,Sql Server 2008,我正在运行一个查询,它需要很长时间。以下是我的示例代码: SELECT @AppleCount=COUNT(*) FROM ( SELECT * FROM @iDToStoreMapping sm WHERE StoreFront=73 AND sm.CategoryCountryCategoryTYpeMappingID NOT IN (SELECT * FROM @FinishedDls) ) rows @AppleCount应该是存在的所有categoryCountry

我正在运行一个查询,它需要很长时间。以下是我的示例代码:

SELECT @AppleCount=COUNT(*) 
FROM (
 SELECT * FROM @iDToStoreMapping  sm 
 WHERE StoreFront=73 
 AND sm.CategoryCountryCategoryTYpeMappingID NOT IN 
 (SELECT * FROM @FinishedDls)
) rows

@AppleCount应该是存在的所有categoryCountryCategoryTypeMappingId,如果应用程序完成下载并在其中写入该id,@Finishedls具有该id,因此此查询应该获得尚未下载的id的计数。大约有5万个ID。我必须运行这个查询3次,但每次都需要几分钟。有什么我做错了吗?

有时使用显式的
连接
而不是
不在
会产生更好的性能:

SELECT @AppleCount = COUNT(*) 
FROM @iDToStoreMapping  sm left outer join
     @FinishedDls fd
     on sm.CategoryCountryCategoryTYpeMappingID = fd.id
WHERE StoreFront = 73 and
      fd.id is null;

有时使用显式的
join
而不是
notin
可以获得更好的性能:

SELECT @AppleCount = COUNT(*) 
FROM @iDToStoreMapping  sm left outer join
     @FinishedDls fd
     on sm.CategoryCountryCategoryTYpeMappingID = fd.id
WHERE StoreFront = 73 and
      fd.id is null;

有时使用显式的
join
而不是
notin
可以获得更好的性能:

SELECT @AppleCount = COUNT(*) 
FROM @iDToStoreMapping  sm left outer join
     @FinishedDls fd
     on sm.CategoryCountryCategoryTYpeMappingID = fd.id
WHERE StoreFront = 73 and
      fd.id is null;

有时使用显式的
join
而不是
notin
可以获得更好的性能:

SELECT @AppleCount = COUNT(*) 
FROM @iDToStoreMapping  sm left outer join
     @FinishedDls fd
     on sm.CategoryCountryCategoryTYpeMappingID = fd.id
WHERE StoreFront = 73 and
      fd.id is null;

我没有在我的表变量上使用主键,这就是导致糟糕性能的原因。对不起大家

我没有在表变量上使用主键,这就是导致糟糕性能的原因。对不起大家

我没有在表变量上使用主键,这就是导致糟糕性能的原因。对不起大家

我没有在表变量上使用主键,这就是导致糟糕性能的原因。对不起大家

回答本人+1表示努力和有用信息回答本人+1表示努力和有用信息回答本人+1表示努力和有用信息回答本人+1表示努力和有用信息回答本人+1表示努力和有用信息