Sql server 优化存储过程
我正在使用SQLServer2008R2。我有这样的存储过程:Sql server 优化存储过程,sql-server,stored-procedures,sql-server-2008-r2,Sql Server,Stored Procedures,Sql Server 2008 R2,我正在使用SQLServer2008R2。我有这样的存储过程: ALTER PROCEDURE [dbo].[GetZone] -- Add the parameters for the stored procedure here @TheInsee int AS BEGIN declare @Zone int declare @CountA int declare @CountB int declare @CountC int declare @CountD int declare
ALTER PROCEDURE [dbo].[GetZone]
-- Add the parameters for the stored procedure here
@TheInsee int
AS
BEGIN
declare @Zone int
declare @CountA int
declare @CountB int
declare @CountC int
declare @CountD int
declare @CountN int
declare @CountP int
declare @CountN1 int
declare @CountN2 int
declare @CountN3 int
declare @CountN4 int
declare @CountN5 int
declare @CountN6 int
SELECT @CountA = COUNT(*) FROM LS_CLIENT_INSEE_A WHERE NO_INSEE = @TheInsee
SELECT @CountB = COUNT(*) FROM LS_CLIENT_INSEE_B WHERE NO_INSEE = @TheInsee
SELECT @CountC = COUNT(*) FROM LS_CLIENT_INSEE_C WHERE NO_INSEE = @TheInsee
SELECT @CountD = COUNT(*) FROM LS_CLIENT_INSEE_D WHERE NO_INSEE = @TheInsee
SELECT @CountN = COUNT(*) FROM LS_CLIENT_INSEE_N WHERE NO_INSEE = @TheInsee
SELECT @CountP = COUNT(*) FROM LS_CLIENT_INSEE_P WHERE NO_INSEE = @TheInsee
SELECT @CountN1 = COUNT(*) FROM LS_CLIENT_INSEE_N1 WHERE NO_INSEE = @TheInsee
SELECT @CountN2 = COUNT(*) FROM LS_CLIENT_INSEE_N2 WHERE NO_INSEE = @TheInsee
SELECT @CountN3 = COUNT(*) FROM LS_CLIENT_INSEE_N3 WHERE NO_INSEE = @TheInsee
SELECT @CountN4 = COUNT(*) FROM LS_CLIENT_INSEE_N4 WHERE NO_INSEE = @TheInsee
SELECT @CountN5 = COUNT(*) FROM LS_CLIENT_INSEE_N5 WHERE NO_INSEE = @TheInsee
SELECT @CountN6 = COUNT(*) FROM LS_CLIENT_INSEE_N6 WHERE NO_INSEE = @TheInsee
set @Zone =
CASE
WHEN @CountA > 0 THEN 1
WHEN @CountB > 0 THEN 2
WHEN @CountC > 0 THEN 3
WHEN @CountD > 0 THEN 4
WHEN @CountN > 0 THEN 5
WHEN @CountP > 0 THEN 6
WHEN @CountN1 > 0 THEN 7
WHEN @CountN2 > 0 THEN 8
WHEN @CountN3 > 0 THEN 9
WHEN @CountN4 > 0 THEN 10
WHEN @CountN5 > 0 THEN 11
WHEN @CountN6 > 0 THEN 12
ELSE 1
END
RETURN @Zone
END
它工作得很好,但是当每个表的数据都非常大时,就会因为超时而挂起。我想知道是否可以简化这个存储过程
这个存储过程非常简单:我只需输入@TheInsee
,当在中找到它时,它会在六个表中搜索
有什么帮助吗?首先,因为您只检查每个表中是否至少存在一行,所以计算所有行没有意义。其次,如果已经在上一个表中找到行,那么查询所有表是没有意义的 我会这样做:
set @Zone = case
when exists (select * from dbo.LS_CLIENT_INSEE_A where NO_INSEE = @TheInsee) then 1
when exists (select * from dbo.LS_CLIENT_INSEE_B where NO_INSEE = @TheInsee) then 2
-- etc.
else 1
end
感谢您提供的解决方案当存在时我如何将select count(1)与select count结合起来?为什么
select*
不使用任何列Select 1
效率更高,如:Select 1 from dbo.LS_CLIENT_INSEE_A其中NO_INSEE=@TheInsee
@JayWalker在存在的查询中Select 1
的效率是SQL Server的神话。MSDN在这种情况下使用星号,请参阅此问题以获得更详细的讨论: