存储过程 – 重新编译后,存储过程运行得很快
发布时间:2020-12-12 16:13:11 所属栏目:MsSql教程 来源:网络整理
导读:我在SQL Server 2008 R2上存储过程有一个非常奇怪的问题.有时,每个月大约一次,我有一个程序变得非常慢,大约需要6秒运行而不是几毫秒.但是,如果我只是重新编译它,而不改变任何东西,它会再次运行. 所有存储过程都不会发生,只有一个(服务器上有几百个). 我的猜测
我在SQL Server 2008 R2上存储过程有一个非常奇怪的问题.有时,每个月大约一次,我有一个程序变得非常慢,大约需要6秒运行而不是几毫秒.但是,如果我只是重新编译它,而不改变任何东西,它会再次运行.
所有存储过程都不会发生,只有一个(服务器上有几百个). 我的猜测是当sp被编译时,它被缓存,这个缓存在每次调用它时被重用,并且这个缓存版本由于某种原因而被破坏. 我希望也许有些人已经面临这种问题,或者至少可以指出我在正确的方向,像SQL Server或IIS的配置可能会影响存储过程缓存? 以下是代码: USE [MyBaseName] GO /****** Object: StoredProcedure [dbo].[Publication_getByCriteria] Script Date: 05/29/2013 12:11:07 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[Publication_getByCriteria] @id_sousTheme As int = null,@id_theme As int = null,@nbPubli As int = 1000000,@bActuSite As bit = null,@bActuPerso As bit = null,@bActuNewsletter As bit = null,@bActuChronique As bit = null,@bActuVideo As bit = null,@bActuVideoBuzz As bit = null,@bActuOpportunite As bit = null,@id_contact As int = null,@bOnlyPublished As bit = 0,@bOnlyForHomePage as bit = 0,@id_contactForTheme As int = null,@id_newsletter As int = null,@ID_ActuChronique As int = null,@sMotClef As varchar(500) = null,@sMotClefForFullText as varchar(500) = '""',@dtPublication As datetime = null,@bParlonsFinance As bit = null,@bPartenaires as bit = null,@bUne As bit = null,@bEditoParlonsFinance As bit = null,@bEditoQuestionFonds as bit = null,@dtDebPublication As datetime = null,@dtFinPublication As datetime = null,@bOnlyActuWithDroitReponse As bit = 0,@bActuDroitReponse As bit = null AS BEGIN SET NOCOUNT ON; DECLARE @dtNow As datetime SET @dtNow = GETDATE() SELECT TOP (@nbPubli) p.id_publication,p.sTitre,p.sTexte,p.sTexteHTML,p.dtPublication,p.id_linkedDroitReponse,si.id_actusite,pe.id_actuPerso,ne.id_actuNewsletter,ac.id_actuChronique,av.id_actuVideo,ap.id_actuOpportunite,ad.id_actuDroitReponse,c.ID_Contact,c.sPhotoCarre,NULL As sTypePubli,n.id_newsletter,dbo.Publication_get1Theme(p.id_publication) As theme,CAST(CASE WHEN ad.id_actuDroitReponse IS NULL THEN 0 ELSE 1 END As bit) As bIsDroitReponse,coalesce(Personne.sNom,Societe.sNom) as sNom,Personne.sPrenom FROM Publication p LEFT OUTER JOIN ActuSite si ON p.id_publication = si.id_publication LEFT OUTER JOIN ActuPerso pe ON p.id_publication = pe.id_publication LEFT OUTER JOIN ActuNewsletter ne ON p.id_publication = ne.id_publication LEFT OUTER JOIN ActuChronique ac ON p.id_publication = ac.id_publication LEFT OUTER JOIN ActuVideo av ON p.id_publication = av.id_publication LEFT OUTER JOIN ActuOpportunite ap ON p.id_publication = ap.id_publication LEFT OUTER JOIN ActuDroitReponse ad ON p.id_publication = ad.id_publication LEFT OUTER JOIN Contact c ON p.id_contact = c.ID_Contact LEFT OUTER JOIN Personne ON Personne.id_contact = c.id_contact LEFT OUTER JOIN Societe ON Societe.id_contact = c.id_contact LEFT OUTER JOIN Newsletter n ON ne.id_actuNewsletter = n.id_actuNewsletter WHERE p.bSupp = 0 AND (@bOnlyPublished = 0 Or (@bOnlyPublished = 1 AND p.dtPublication IS NOT NULL AND p.dtPublication < @dtNow)) AND (@id_sousTheme IS NULL Or p.id_publication IN(SELECT id_publication FROM PubliSousTheme WHERE id_soustheme = @id_sousTheme)) AND (@id_theme IS NULL Or p.id_publication IN(SELECT id_publication FROM PubliTheme WHERE id_theme = @id_theme)) AND ((@bActuSite = 1 AND si.id_actusite IS NOT NULL) OR (@bActuPerso = 1 AND pe.id_actuPerso IS NOT NULL) OR (@bActuNewsletter = 1 AND ne.id_actuNewsletter IS NOT NULL) OR (@bActuChronique = 1 AND ac.id_actuChronique IS NOT NULL) OR (@bActuVideo = 1 AND av.id_actuVideo IS NOT NULL) OR (@bActuVideoBuzz = 1 AND av.id_actuVideo IS NOT NULL and coalesce(av.sBuzz,'') <> '' ) OR (@bActuOpportunite = 1 AND ap.id_actuOpportunite IS NOT NULL) OR (@bActuDroitReponse = 1 AND ad.id_actuDroitReponse IS NOT NULL)) AND (@id_contact IS NULL Or p.id_contact = @id_contact) AND (@id_contactForTheme IS NULL Or (p.id_publication IN(SELECT id_publication FROM PubliSousTheme WHERE id_soustheme IN(SELECT id_soustheme FROM ContactSousTheme WHERE id_contact = @id_contactForTheme))) Or (p.id_publication IN(SELECT id_publication FROM PubliTheme WHERE id_theme IN(SELECT id_theme FROM ContactTheme WHERE id_contact = @id_contactForTheme))) ) AND (@ID_ActuChronique is NULL or id_actuChronique = @ID_ActuChronique) AND (@id_newsletter IS NULL Or p.id_publication IN(SELECT id_publication FROM ListActuNewsletter WHERE id_newsletter = @id_newsletter)) AND (@sMotClef IS NULL or contains((p.sTexte,p.sTitre),@sMotClefForFullText) Or Personne.sNom LIKE '%' + @sMotClef + '%' COLLATE Latin1_General_CI_AI Or Personne.sPrenom LIKE '%' + @sMotClef + '%' COLLATE Latin1_General_CI_AI Or Societe.sNom LIKE '%' + @sMotClef + '%' COLLATE Latin1_General_CI_AI ) AND (@dtPublication IS NULL Or p.dtPublication >= @dtPublication) AND ( @bParlonsFinance IS NULL Or (@bParlonsFinance = 0 AND p.id_publication NOT IN(SELECT id_publication FROM PubliTheme WHERE id_theme IN(SELECT id_theme FROM Theme WHERE bParlonsFinance = 1))) Or (@bParlonsFinance = 1 AND p.id_publication IN(SELECT id_publication FROM PubliTheme WHERE id_theme IN(SELECT id_theme FROM Theme WHERE bParlonsFinance = 1)))) AND ( @bPartenaires IS NULL Or (@bPartenaires = 0 AND p.id_publication NOT IN(SELECT id_publication FROM PubliTheme WHERE id_theme IN(SELECT id_theme FROM Theme WHERE 0 = 1))) Or (@bPartenaires = 1 AND p.id_publication IN(SELECT id_publication FROM PubliTheme WHERE id_theme IN(SELECT id_theme FROM Theme WHERE 0 = 1)))) AND ( @bUne IS NULL Or p.bUne = @bUne) AND (@bEditoParlonsFinance IS NULL Or p.bEditoParlonsFinance = @bEditoParlonsFinance) AND (@bEditoQuestionFonds IS NULL Or p.bEditoQuestionFonds = @bEditoQuestionFonds) AND (@dtDebPublication IS NULL Or p.dtPublication >= @dtDebPublication) AND (@dtFinPublication IS NULL Or p.dtPublication <= @dtFinPublication) AND (@bOnlyActuWithDroitReponse = 0 Or (@bOnlyActuWithDroitReponse = 1 AND p.id_linkedDroitReponse IS NOT NULL)) and (@bOnlyForHomePage = 0 or (@bOnlyForHomePage = 1 and ac.bHomePage = 1)) ORDER BY coalesce(p.dtPublication,p.dtCreate) DESC,p.id_publication DESC END 解决方法当您首次编译存储过程时,其执行计划将被缓存.如果sproc具有参数,其定义可以显着更改包含的查询的执行计划(例如,索引扫描vs查询),则存储过程的缓存计划可能对所有参数定义最有效. 避免这种情况的一种方法是将RECOMPILE子句包含在CREATE PROCEDURE语句中. 例: CREATE PROCEDURE dbo.mySpro @myParam WITH RECOMPILE AS BEGIN -- INSERT WORKLOAD HERE END GO 通过这样做,每当调用该过程时,将会生成一个新的计划.如果重新编译时间使用错误的缓存计划时间损失,这是值得使用WITH RECOMPILE.在您的情况下,它还会节省您每次发现其执行缓慢时手动重新编译此过程所需的时间/计划. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- sql-server-2008 – 在SQL Server管理工作室的地理列中输入
- SELECT中的MSSQL强制转换([varcharColumn]为int)在WHERE子句
- SQLServer2005 Pivot 转置使用动态列
- sqlserver2000 把数据库改名(包括修改逻辑文件名,以便备份
- sqlserver 查看死锁和运行进程
- sql-server – 结合SharePoint和数据库镜像
- SqlServer查询数据库所有用户表的记录数
- Windows server 2008 r2下MySQL5.7.17 winx64安装版配置方法
- 强制删除sqlserver2008发布
- SqlServer 可更新订阅中在订阅库并发获取最大单据号死锁测试
推荐文章
站长推荐
- 讲解SQL Server 2005数据库的同义词Bug
- mssql sqlserver 将字段null(空值)值替换为指定值
- 判断数据库表是否存在以及修改表名的方法
- SQL 2005使用PARTITION and Rank实现group by to
- sql-server – 如何强制SQL Server Management S
- sqlserver,执行生成脚本时“引发类型为“System
- MySQL数据库如何开启远程连接(多备份)
- SqlServer 获取字符串中小写字母的sql语句
- 通过命令行导入到mysql数据库时出现乱码的解决方
- sql-server – 如何在没有VerifyExtraction的情况
热点阅读