【问题标题】:Optimized Stored Procedure优化的存储过程
【发布时间】:2013-01-08 15:46:02
【问题描述】:

我正在使用 SQL Server 2008 R2。我有这样的存储过程:

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,它就会在六个表中搜索。

有什么帮助吗?

【问题讨论】:

    标签: sql-server stored-procedures sql-server-2008-r2


    【解决方案1】:

    首先,由于您只是检查每个表中是否至少存在一行,因此计算所有行是没有意义的。其次,如果您已经在前一个表中找到了行,那么查询所有表是没有意义的。

    我会这样做:

    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
    

    【讨论】:

    • 感谢您的解决方案
    • 当存在选择计数 (1) 时如何组合?
    • 当没有使用任何列时为什么要select *Select 1 会更高效:select 1 from dbo.LS_CLIENT_INSEE_A where NO_INSEE = @TheInsee
    • @JayWalker SELECT 1EXISTSquery 中的效率是一个SQL Server 都市神话。 MSDN documents 在这种情况下使用星号并查看此问题以获得更详细的讨论:stackoverflow.com/questions/1597442/…
    猜你喜欢
    • 2021-04-17
    • 2012-02-26
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多