Sql server 目的地 -- 更新T1 设置DeleteFlag=1 从myschema出发。目的地T1,目的地T2 哪里 T1.MyPhone=T2.MyPhone和 T1.FullName=T2.FullName和 T1.Address1=T2.Address1和 T1.城市=T2.城市和 T1.[状态]=T2.[状态]和 T1.Zip5=T2.Zip5和 T1.MyPhone“”和 T1.Id=T2.Id,这将标记批处理本身 T1.Id=@BatchId和 T1.Id0 从myschema.Destination中删除 哪里 (DeleteFlag=1)和(Id=@BatchId) -- -- 8. 使用上次运行的日期更新标题 -- 更新myschema.Header SET DateLastRun=GETDATE() 其中ID=@BatchId 结束 去

Sql server 目的地 -- 更新T1 设置DeleteFlag=1 从myschema出发。目的地T1,目的地T2 哪里 T1.MyPhone=T2.MyPhone和 T1.FullName=T2.FullName和 T1.Address1=T2.Address1和 T1.城市=T2.城市和 T1.[状态]=T2.[状态]和 T1.Zip5=T2.Zip5和 T1.MyPhone“”和 T1.Id=T2.Id,这将标记批处理本身 T1.Id=@BatchId和 T1.Id0 从myschema.Destination中删除 哪里 (DeleteFlag=1)和(Id=@BatchId) -- -- 8. 使用上次运行的日期更新标题 -- 更新myschema.Header SET DateLastRun=GETDATE() 其中ID=@BatchId 结束 去,sql-server,tsql,Sql Server,Tsql,谢谢, Christian查看存储过程和查询会有所帮助,但我猜存储过程中缓存了一些“不好”的东西。尝试清除SQL的缓存(假定SQL Server来自您的标记)。请参见存储过程可能存在错误的查询计划。尝试删除并重新创建存储过程。在过程中使用参数和特殊常量时,通常会发生这种情况 SQL Server通常会尝试生成可重用的计划。对于常量,它不需要这样做,因为它永远不能用于不同的常量 还有其他选项,例如为存储过程或数据类型不匹配设置选项。。但是我们没有更多的信息可以继续。1-显示代码 2-在没有看到代码

谢谢,
Christian

查看存储过程和查询会有所帮助,但我猜存储过程中缓存了一些“不好”的东西。尝试清除SQL的缓存(假定SQL Server来自您的标记)。请参见

存储过程可能存在错误的查询计划。尝试删除并重新创建存储过程。

在过程中使用参数和特殊常量时,通常会发生这种情况

SQL Server通常会尝试生成可重用的计划。对于常量,它不需要这样做,因为它永远不能用于不同的常量

还有其他选项,例如为存储过程或数据类型不匹配设置选项。。但是我们没有更多的信息可以继续。

1-显示代码


2-在没有看到代码的情况下,我猜您有多个参数要传递给存储的进程,并且您有一个

这可能是由于参数嗅探。你比较过执行计划了吗?如果从中获取免费的PlanExplorer,您可以非常清楚地看到存储过程中参数的运行时值与编译后的值。有时,在过程中添加重新编译有助于防止错误的计划死缠烂打(每次执行过程时,CPU使用率都会略高)。但这并不总是最好的答案-当前缓存的计划可能是非典型的,每次重新编译都可能是过度的。有时,答案取决于参数的定义方式——例如,如果在中传递参数,则有时可以通过声明局部变量并将输入参数传递给该局部变量,然后在代码中使用局部变量来击败参数嗅探。有时,答案是打开“针对特定对象优化”设置。没有更多细节很难说


不过,调查该计划是很好的第一步。如果您看到计划不同,请发回差异,我们可以帮助您。

可能是您以一种有趣的方式将驱动查询放入循环中,使其执行太多次


我同意所有其他人的意见-显示代码。

我认为存储过程有严重错误。。。。你能给我们看一下代码吗?如果是这样的话,那么为什么同样的代码在使用相同的批处理的情况下,在特定情况下运行速度要快1000倍呢?我已经提供了上面的代码。这只是一个框架,这个问题的答案可能取决于
——Process Batch
是否正确,我没有提供完整的代码,因为问题在于代码是否有效。问题是,为什么在执行时间方面,ad hoc和exec之间存在如此大的差异。我们需要了解计划的不同之处,并告诉您为什么它们不同。但是,如果代码出于某种原因容易出现这种问题(同样,除非您向我们展示代码,否则我们不确定是否给出了完整的答案),那么向我们展示代码可以帮助我们首先指导您避免这些差异。我们确实运行了DBCC FreeProcCache DBCC DROPCLEANBUFFERSCREATE过程[myschema]。[ProccesBatch]--将存储过程的参数添加到此处(@BatchId int),作为BEGIN--SET NOCOUNT ON添加,以防止额外的结果集--干扰SELECT语句。不计数;将ANSI_空值设置为ON;--仅限临时测试。这在运行即席会议时会被取消注释。--DECLARE@BatchId Int--SET@BatchId=59--Process Batch END GOOnly传递了1个参数
USE [MyDB]

GO



/****** Object:  StoredProcedure [myschema].[ProccesBatch]    Script Date: 06/30/2011 10:37:33 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE PROCEDURE [myschema].[ProccesBatch] 
-- Add the parameters for the stored procedure here

(@BatchId int)


AS

BEGIN

-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.

SET NOCOUNT ON;
SET ANSI_NULLS ON;

-- AD Hoc TESTING ONLY. This gets uncommented when running ad hoc.
-- DECLARE @BatchId Int
-- SET @BatchId = 59

DECLARE @MyList AS VARCHAR (500)
DECLARE @MySICList AS VARCHAR (500)
DECLARE @MyType AS CHAR (1)
DECLARE @MyProvider AS VARCHAR (500)
DECLARE @MyState AS VARCHAR (2)
DECLARE @MyCityList AS VARCHAR (500)
DECLARE @MyZipList AS VARCHAR (500)
DECLARE @MyStyle AS VARCHAR (1)
DECLARE @MySource AS VARCHAR (150)
DECLARE @MyStartDate AS DATETIME
DECLARE @MyEndDate AS DATETIME
DECLARE @MyCampaign  AS BIT
DECLARE @CheckExist AS INT
SET @CheckExist = 0
-- 
--  1. Check if Campaign Exist.
--  
SELECT 
    @CheckExist = Id 
FROM myschema.Destination
WHERE Id = @BatchId

IF @CheckExist > 0
     BEGIN
     RAISERROR('Creation has already been processed', 16, 1)
     RETURN
     END      

-- 
--  2. Get Header and parameters for controlling process.
-- 
SELECT       
    @MyList = ISNULL(LeadBatchHeaderList,''),       
    @MySICList = ISNULL(SICCodeList,''),
    @MyType = ISNULL(MyType,''),
    @MyProvider = ISNULL(LDCList,''),
    @MyState = ISNULL([State],''),
    @MyCityList = ISNULL(CityList,''),      
    @MyZipList = ISNULL(ZipCodeList,''),        
    @MyStyle = ISNULL(Commodities,''),
    @MySource = ISNULL(LeadSource,''),
    @MyStartDate = ISNULL(HeaderCreationStart,''),
    @MyEndDate = ISNULL(HeaderCreationEnd,''),
    @MyCampaign = ISNULL(AllCampaign ,'')
FROM myschema.Header
WHERE ID = @BatchId

IF @@ROWCOUNT < 1
     BEGIN
     RAISERROR('header id was not found', 16, 1)
     RETURN
     END   

-- Place Commas for charindex     
IF @MyList > ''
    SET @MyList = ',' + @MyList + ','
IF @MySICList  > ''
    SET @MySICList =  ',' + @MySICList + ','
IF @MyProvider > ''
    SET @MyProvider = ',' + @MyProvider + ','
IF @MyCityList > '' 
    SET @MyCityList = ',' + @MyCityList + ','   
IF @MyZipList > '' 
    SET @MyZipList = ',' + @MyZipList + ','    

--
-- 3. Add  qualifying leads.
--
INSERT INTO myschema.Destination    
(Id, LeadBatchDetailId, CustomerIdOne, CustomerIdTwo, MyProviderOne, MyProviderTwo, SicCode, SicDesc, SicCode2, SicDesc2, 
MyType, Company, CompanyURL, Title, Salutation, Suffix, FullName, FirstName, MiddleInitial, 
LastName, Email, MyPhone, Work, Cell, Home, Fax, Ext, Address1, Address2, City, [State], 
Zip5, Zip4, County, TSR, EmployeeSize, Revenue, MyProviderOne, MyProviderTwo, CustomerUsageOne, CustomerUsageTwo, MyExpenses, Remarks, Decline, 
WhyLeft, PCC, RCC, PCC, SCC)
SELECT 
    @BatchId, d.ID, d.CustomerIdOne, d.CustomerIdTwo, d.MyProviderOne, d.MyProviderTwo, d.SicCode, d.SicDesc, d.SicCode2, d.SicDesc2, 
    d.MyType, d.Company, d.CompanyURL, d.Title, d.Salutation, d.Suffix, d.FullName, d.FirstName, d.MiddleInitial, 
    d.LastName, d.Email, d.MyPhone, d.Work, d.Cell, d.Home, d.Fax, d.Ext, d.Address1, d.Address2, d.City, d.[State], 
    d.Zip5, d.Zip4, d.County, d.TSR, d.EmployeeSize, d.Revenue, d.MyProviderOne, d.MyProviderTwo,d.CustomerUsageOne, d.CustomerUsageTwo, d.MyExpenses, d.Remarks, d.Decline, 
    d.WhyLeft, d.PCC, d.RCC, d.PCC, d.SCC
FROM myschema.Source as d 
JOIN myschema.Summary as h ON d.MyId = h.ID
JOIN myschema.source AS s ON h.Id = s.ID
WHERE
    -- MyId. 
    (@MyList = '' OR (charindex(',' + CAST(d.MyId AS VARCHAR) + ',', @MyList) > 0)) AND

    -- SIC Code. 
    (@MySICList = '' OR (charindex(',' + CAST(d.SicCode AS VARCHAR) + ',', @MySICList) > 0)) AND

    -- My Types 
    (@MyType = '' OR @MyType = 'A' OR d.MyType = @MyType OR h.DefaultMyType = @MyType) AND

    -- MYProviders
    ((@MyProvider = '' OR (charindex(',' + CAST(d.MyProviderOne AS VARCHAR) + ',', @MyProvider) > 0)) OR
    (@MyProvider = '' OR (charindex(',' + CAST(d.MyProviderTwo AS VARCHAR) + ',', @MyProvider) > 0))) AND

    -- State. 
    (@MyState = '' OR d.[State] = @MyState) AND

    -- City.
    (@MyCityList = '' OR (charindex(',' + d.City + ',', @MyCityList) > 0)) AND

    -- Zip Code. 
    (@MyZipList = '' OR (charindex(',' + d.Zip5 + ',', @MyZipList) > 0)) AND

    -- LeadSource
    (@MySource = '' OR s.MySource = @MySource) AND

    -- Between Dates
    (@MyStartDate = '' AND @MyEndDate = '' OR h.CreationDate BETWEEN @MyStartDate AND @MyEndDate) AND 

     -- Mystyle
    ((@MyStyle = 'A' AND (d.MyProviderOne IS NOT NULL OR d.MyProviderOne > 0 OR d.CustomerUsageOne > 0)) OR
    (@MyStyle = 'B' AND (d.MyProviderTwo IS NOT NULL OR d.MyProviderTwo > 0 OR d.CustomerUsageTwo > 0)) OR
    (@MyStyle = '' OR @MyStyle IS NULL)) AND

    -- Source parameters are important. Only processed finished batches.
    (h.UseThisRecord = 1) AND
    (h.[status] = 'Finished') AND
    (d.MyDuplicate IS NULL) AND
    (d.DoNotUseFlag IS NULL) AND
    (d.DoNotUseIFlag IS NULL) AND
    (d.CustomerHome IS NULL) AND
    (d.CustomerWork IS NULL) AND
    (d.LeadDuplicate IS NULL) AND
    (d.MyPhone >'' OR d.MyPhone <> NULL) AND
    ((CAST(FLOOR( CAST( h.ExpirationDate AS FLOAT ) )AS DATETIME) > CAST(FLOOR( CAST( GETDATE() AS FLOAT ) )AS DATETIME)) OR 
    h.ExpirationDate IS NULL)



--
-- 4. Flag Phone Duplicates inside myschema.Destination
--

 UPDATE T1
  SET DeleteFlag = 1
  FROM myschema.Destination T1, myschema.Destination T2
  WHERE
        T1.MyPhone = T2.MyPhone AND                   
        T1.FullName = T2.FullName AND 
        T1.Address1 = T2.Address1 AND       
        T1.City = T2.City AND                     
        T1.[State] = T2.[State] AND                     
        T1.Zip5 = T2.Zip5 AND                     
        T1.MyPhone <> '' AND
        T1.Id = T2.Id AND -- This will flag the batch itself
        T1.Id = @BatchId AND
        T1.Id < T2.Id  -- This will leave the highest Id unflagged (latest record) 



--
-- 5. Duplicate Contact Flag. All Records
--      
IF @MyCampaign  = 1
UPDATE T1
  SET DeleteFlag = 1
  FROM myschema.Destination T1, myschema.Destination T2
  WHERE
        T1.MyPhone = T2.MyPhone AND                   
        T1.FullName = T2.FullName AND 
        T1.Address1 = T2.Address1 AND       
        T1.City = T2.City AND                     
        T1.[State] = T2.[State] AND                     
        T1.Zip5 = T2.Zip5 AND                     
        T1.MyPhone <> '' AND
        T1.Id = @BatchId AND
        T1.Id <> T2.Id -- Process against other batches



--
-- 6. Active Flag
--  

IF @MyCampaign <> 1
UPDATE T1
  SET DeleteFlag = 1
  FROM myschema.Destination T1, myschema.Destination T2
  JOIN myschema.Header H ON T2.Id = H.ID
  WHERE
        T1.MyPhone = T2.MyPhone AND                   
        T1.FullName = T2.FullName AND 
        T1.Address1 = T2.Address1 AND       
        T1.City = T2.City AND                     
        T1.[State] = T2.[State] AND                     
        T1.Zip5 = T2.Zip5 AND                     
        T1.MyPhone <> '' AND
        T1.Id = @BatchId AND
        T1.Id <> T2.Id AND -- Process against other batches
        H.ActiveBatch = 1 -- Only Active



--
-- 7. Delete DeleteFlag rows. Check for Id just in case
--  
IF @BatchId > 0
    DELETE FROM myschema.Destination
        WHERE        
            (DeleteFlag = 1) AND (Id = @BatchId)



--
-- 8. Update header with date last run
--                  
UPDATE myschema.Header
SET DateLastRun = GETDATE()
WHERE ID = @BatchId



END






GO