我有一个查询,我将存储过程.当我使用局部变量运行查询时,查询需要大约1秒才能运行.当我在存储过程中放入相同的查询并调用SP时,运行大约需要2分钟.
从之前的问题来看,我认为它可能与参数嗅探有关.当我在我的SP中声明局部变量然后在整个过程中使用局部变量之前我遇到过这个问题.这在过去有效,但在这种情况下似乎没有帮助我.
我现在有
CREATE PROCEDURE dbo.ProcedureName
@DIV VARCHAR(4),
@STD VARCHAR(1), -- S or N
@scen varchar(20)
AS
BEGIN
DECLARE
@DIV_copy VARCHAR(4),
@STD_copy VARCHAR(1),
@scen_copy varchar(20);
SELECT
@DIV_copy = @DIV,
@STD_copy = @STD,
@scen_copy = @scen;
Run Code Online (Sandbox Code Playgroud)
我也试过WITH RECOMPILE像这样添加
CREATE PROCEDURE dbo.ProcedureName
@DIV VARCHAR(4),
@STD VARCHAR(1), -- S or N
@scen varchar(20)
WITH RECOMPILE
AS
BEGIN
DECLARE
@DIV_copy VARCHAR(4),
@STD_copy VARCHAR(1),
@scen_copy varchar(20);
SELECT
@DIV_copy = @DIV,
@STD_copy = @STD,
@scen_copy = @scen;
Run Code Online (Sandbox Code Playgroud)
另外,我尝试OPTION(RECOMPILE)在我的SP末尾添加如下:
SELECT *
FROM #Output …Run Code Online (Sandbox Code Playgroud) 这是我一整天都在努力解决的一个非常有趣的问题.我有一张表,其中包含位置的ID,纬度和经度.这是来自更大位置的位置的子集.
我想要做的是使用这个位置子集,并且对于每个位置,使用空中距离返回距离较大集合20英里内的位置.我的问题不是计算空中距离,这是有效的,我的问题是如何像For循环一样操作每一行,但使用基于集合的方法.
所以我们假设这是我的子集表LocationSubset
+----+---------+----------+
| ID | Lat | Lon |
+----+---------+----------+
| 1 | 41.0575 | -92.1364 |
+----+---------+----------+
| 2 | 47.0254 | -92.5723 |
+----+---------+----------+
| 3 | 38.9897 | -88.7623 |
+----+---------+----------+
Run Code Online (Sandbox Code Playgroud)
我正在寻找更大的桌子,地点
+----+---------+-----------+
| ID | Lat | Lon |
+----+---------+-----------+
| 1 | 41.0575 | -92.1364 |
+----+---------+-----------+
| 2 | 47.0254 | -92.5723 |
+----+---------+-----------+
| 2 | 38.9897 | -88.7623 |
+----+---------+-----------+
| 4 | 36.2137 | -91.6528 |
+----+---------+-----------+ …Run Code Online (Sandbox Code Playgroud) 我继承了相当多的Excel VBA代码,这些代码很不稳定且运行缓慢.该代码将用户输入模拟成数千次,然后生成输出文件以发送给其他一些用户.到目前为止,我通过消除复制/粘贴,通过在数组内工作而不是直接访问工作表和单元格,删除不必要的代码,以及通过将许多易失性公式重新处理成更好的东西,在性能上取得了很大的进步.
在我的更改之前,运行此报告来模拟用户输入每个用户大约需要65秒(并且大约有4,300个用户).那是279,500秒(大约77.6小时).这是假设一个恒定的速度,宏开始的速度相同.事实并非如此.实际上,宏在一夜之间处理时显着减慢,到每个用户花费超过120秒的程度.
在我的代码清理和性能改进之后,我得到了宏,每个用户大约10秒开始,这是一个很好的速度.我让这个宏在昨晚一夜之间运行,今天早上来看看它现在每个用户大约需要90秒,所以我在一夜之间遇到了很大的性能下降.
我的问题是:如果随着时间的推移宏运行,我如何防止这种减速?
我并非没有想法.目前,我的想法是,我需要关闭并重新打开Excel工作簿,因为它们陷入垃圾陷入困境.我的一个想法是使用本机VB.NET应用程序打开Excel工作簿并运行宏.每500个左右的用户,我可以在工作簿的单元格中的某处写入相关变量,保存并关闭工作簿,然后重新打开它以从我离开的地方继续.这对我来说似乎并不优雅.此外,可能很难说服其他人我需要引入"新"技术(VB.NET).人们对此很奇怪,并且更喜欢原生的VBA解决方案.
有没有更好的方法来管理Excel,这样我就不必创建一个新的VB.NET应用程序并进行保存/关闭/打开?
我想补充说,没有特定的违规代码,随着时间的推移,它只会减慢速度(仍然有效!).