我有一个存储过程,每次从Web应用程序调用它都会疯狂地超时.
我启动了Sql Profiler并跟踪了那些超时的调用,最后找到了这些东西:
除此之外,我的web应用程序都有自己的用户事实上,每一件事情是相同的(相同的数据库,连接,服务器等),我也试过直接与Web应用程序的用户的工作室运行查询,并没有花费超过6秒.
我怎样才能知道发生了什么?
我假设它与我们使用BLL> DAL图层或表适配器这一事实无关,因为跟踪清楚地显示了延迟在实际过程中.这就是我所能想到的.
编辑我在这个链接中发现ADO.NET设置ARITHABORT为true - 这在大多数情况下是好的,但有时会发生这种情况,建议的解决方法是向with recompile存储过程添加选项.在我的情况下,它不起作用,但我怀疑它与此非常相似.任何人都知道ADO.NET做了什么或者我在哪里可以找到规范?
我在SQL(变量名称混淆)中获得了以下查询,该查询试图获得值(Ch,Wa,Bu,Hi),从而得到Pi条目的最大数量(cnt).
select top 1 Pi.Ch, Pi.Wa, Pi.Bu, Pi.Hi, COUNT(1) as cnt
from Product, Si, Pi
where Product.Id = Si.ProductId
and Si.Id = Pi.SiId
and Product.Code = @CodeParameter
group by Pi.Ch, Pi.Wa, Pi.Bu, Pi.Hi
order by cnt desc
Run Code Online (Sandbox Code Playgroud)
它在我们的生产数据库的SQL管理工作室中立即运行.我已经在C#LINQ和Entity Framework中成功编写了一些代码,但代码运行的方式都是8到10秒.一次尝试是以下代码(在没有打印的情况下执行此操作,因为一次调用会产生相同的性能结果):
using(var context = new MyEntities()){
var query = context.Products
.Where(p => p.Code == codeFromFunctionArgument)
.Join(context.Sis, p => p.Id, s => s.ProductId, (p, s) => new { sId = s.Id })
.Join(context.Pis, ps => ps.sId, pi => pi.SiId, (ps, pi) => new …Run Code Online (Sandbox Code Playgroud) 我有一个查询,我通过ADO.NET与SQL Server 2008R2一起使用.当我在内联使用LIKE子句时,它在不到一秒的时间内工作,从200万返回5行.如果我在SSMS查询开始时像在.NET中那样声明参数,那就需要永远.
它是相同的查询,但参数化.
第一个(工作正常)是(工作正常):
;WITH Results_CTE AS (
SELECT ld.* , ROW_NUMBER() OVER (ORDER BY PK_ID) AS RowNum
FROM list..List_Data ld
WHERE Name IS NOT NULL AND
Postcode LIKE 'SW14 1xx%'
) SELECT * FROM Results_CTE
Run Code Online (Sandbox Code Playgroud)
永远需要的第二个是:
declare @postcode varchar(10) = 'SW14 1xx'
;WITH Results_CTE AS (
SELECT ld.* , ROW_NUMBER() OVER (ORDER BY PK_ID) AS RowNum
FROM list..List_Data ld
WHERE Name IS NOT NULL AND
Postcode LIKE @postcode +'%'
) SELECT * FROM Results_CTE
Run Code Online (Sandbox Code Playgroud)
我相信这与SQL Server的内部工作有关,但我真的不知道.
我正在尝试使用SQL Server 2008R2从ADO.NET运行查询.我使用的是CTE提供寻呼和增加对参数@Offset和@Limit,这都是整数.
我正在根据用户输入构建参数化查询.最终输出是这样的:
;WITH Results_CTE AS (
SELECT ld.* , ROW_NUMBER() OVER (ORDER BY Key_Field) AS RowNum
FROM list..List_Data ld
WHERE VALUE_2010 IS NOT NULL
AND Postcode LIKE @Postcode + '%'
) SELECT * FROM Results_CTE
WHERE RowNum > @Offset AND RowNum < @Offset + @Limit
OPTION (RECOMPILE)
Run Code Online (Sandbox Code Playgroud)
我正在使用一些类似的条款,这就是我的原因OPTION RECOMPILE.如果我通过SSMS声明参数并运行如下:
declare @postcode varchar(10) = 'SW1 1AA';
declare @Offset int = 0;
declare @Limit int = 10;
Run Code Online (Sandbox Code Playgroud)
我的响应时间非常快(不到1秒).但是,如果我尝试使用ADO.NET,它需要永远.我尝试用这两个参数添加参数:
cmd.Parameters.AddWithValue("@Offset", startRowIndex) // times out
cmd.Parameters.AddWithValue("@Limit", …Run Code Online (Sandbox Code Playgroud) 有没有更有效的方法来编写这个SQL查询?
它在大约45秒内从一组100,000行返回大约800行.
我正在使用Sql Server 2008 R2
Select a.Div as Division
,a.Room as RoomLocation
,a.Form as Forms
,a.Nums as TotalNumberLocations
From AView a
Where a.Id = '1'
And a.Div = 'A'
Group By a.Div, a.Nums, a.Room, a.Form
union
Select b.Div as Division
,b.Room as RoomLocation
,b.Form as Forms
,b.Nums as TotalNumberLocations
From AView b
Where b.Id = '1'
And b.Div = 'G'
Group By b.Div, b.Nums, b.Room, b.Form
union
Select c.Div as Division
,c.Room as RoomLocation
,c.Form as Forms
,c.Nums as …Run Code Online (Sandbox Code Playgroud) 我正在尝试将SQL语句编写为字符串文字,其中包含两个变量,如下所示 -
String str="abc"; int val=123;
String sql=@"SELECT Column1, Column2
FROM Table
WHERE Column1= '"" + str + ""' AND Column2 > "" + val + ""
ORDER BY Column1";
Run Code Online (Sandbox Code Playgroud)
但这些变量不被视为变量.有帮助吗?
更新:添加order by子句的屏幕截图.有红色卷曲下划线.
