这是一个依赖于两个非聚集索引的基本查询:
SELECT cc.categoryid, count(*) from company c
INNER JOIN companycategory cc on cc.companyid = c.id
WHERE c.placeid like 'ca_%'
GROUP BY cc.categoryid order by count(*) desc
Run Code Online (Sandbox Code Playgroud)
在SQL Server 2008上托管完全相同的数据库时,几乎在任何硬件上都会返回<500 ms.即使清除了缓存缓冲区:
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
Run Code Online (Sandbox Code Playgroud)
...在传统的SQL上,这仍然会在~1秒内返回.
在Azure上,每次返回大约需要3.5秒.
有些文章似乎表明人们通常对SQL Azure中的查询性能感到满意.然而,这是一个基本的场景,其中"明显的"调优已经用尽,并且没有网络延迟问题可言.使用大表时工作速度非常慢(companycategroy有1.2M记录,地方有7.5K).
总数据库大小不超过4GB.选择"网络"版和"企业版"似乎也没有太大的区别.
我错过了什么?
这只是一个基本的例子,只有更复杂的查询才会变得更糟,所有这些都经过了审核,调整和内部执行.
这是执行计划:
|--Sort(ORDER BY:([Expr1004] DESC))
|--Compute Scalar(DEFINE:([Expr1004]=CONVERT_IMPLICIT(int,[Expr1007],0)))
|--Hash Match(Aggregate, HASH:([cc].[CategoryId]), RESIDUAL:([XX].[dbo].[CompanyCategory].[CategoryId] as [cc].[CategoryId] = [XX].[dbo].[CompanyCategory].[CategoryId] as [cc].[CategoryId]) DEFINE:([Expr1007]=COUNT(*)))
|--Hash Match(Inner Join, HASH:([c].[Id])=([cc].[CompanyId]))
|--Index Scan(OBJECT:([XX].[dbo].[Company].[IX_Company_PlaceId] AS [c]), WHERE:([XX].[dbo].[Company].[PlaceId] as [c].[PlaceId] like N'ca_%'))
|--Index …Run Code Online (Sandbox Code Playgroud) 我一直在使用Autoscale在2到1个云服务实例之间转换,以降低成本.这主要是有效的,除了不时(不确定这里的模式是什么),扩展(1-> 2)的行为导致两个实例都回收,为用户生成服务中断.
假设RoleEntry在响应拓扑更改时没有花哨的东西,为什么从1-> 2扩展会重新启动已经运行的实例?
补充说明:
我们正在为ASP.NET应用程序使用进程外会话提供程序(ScaleOut),我们注意到当一个没有正确设置反序列化的对象无意中进入会话时,它最终会导致整个终止的过程.
重现和处理这种情况是它变得更有趣的地方.
在AnyStaObjectsInSessionState中引发了终止进程的异常,其实现非常简单:
internal static bool AnyStaObjectsInSessionState(HttpSessionState session)
{
if (session != null)
{
int count = session.Count;
for (int i = 0; i < count; i++)
{
object obj2 = session[i];
if (((obj2 != null) && (obj2.GetType().FullName == "System.__ComObject"))
&& (UnsafeNativeMethods.AspCompatIsApartmentComponent(obj2) != 0))
{
return true;
}
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
这是堆栈跟踪,显示了异常如何终止进程:
An unhandled exception occurred and the process was terminated.
Application ID: /LM/W3SVC/1/ROOT
Process ID: 4208
Exception: System.Runtime.Serialization.SerializationException
Message: …Run Code Online (Sandbox Code Playgroud) 两部分问题(部分密切相关):使用IIS7采用的默认OOTB ETag策略,为什么我们在浏览页面时看不到If-None-Match/304交互?
例如,为空缓存请求返回的标头是:
Content-Type image/png
Last-Modified Thu, 03 Dec 2009 15:51:56 GMT
Accept-Ranges bytes
Etag "a8a0628a3074ca1:0"
Server Microsoft-IIS/7.0
X-Powered-By ASP.NET
Date Tue, 22 Dec 2009 19:47:36 GMT
Content-Length 1780
Run Code Online (Sandbox Code Playgroud)
...然后对页面的后续访问不会为图像生成304往返?
此外,IIS7 的默认applicationHost文件具有以下(1):
<caching enabled="true" enableKernelCache="true">
</caching>
Run Code Online (Sandbox Code Playgroud)
enableKernelCache ='true'是否扩展到所有静态文件,使您无需显式注册扩展以将CacheUntilChange授予内核策略(2):
<caching>
<profiles>
<add extension=".gif" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" />
<add extension=".png" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" />
<add extension=".js" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" />
<add extension=".css" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" />
<add extension=".jpg" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" /> …Run Code Online (Sandbox Code Playgroud) 我们使用DiagnosticMonitorTraceListener作为通用跟踪侦听器(主要用于ASP.NET运行状况监视)以及用于异常处理的Enterprise Library 5侦听器.这在Azure上运行时效果很好,但重要的是我们能够以最小的更改在Azure之外运行网站.
一种选择是动态注册,如下所示:
protected void Application_Start()
{
if (Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.IsAvailable)
{
System.Diagnostics.Trace.Listeners.Add(new Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener());
System.Diagnostics.Trace.AutoFlush = true;
}
}
Run Code Online (Sandbox Code Playgroud)
这适用于ASP.NET Health Monitoring和System.Diagnosics的一般用途,但不适用于我们具有以下硬编码配置的Enterprise Library:
<categorySources>
<add switchValue="All" name="General">
<listeners>
<add name="Event Log Listener" />
<add name="Azure Diagnostics Trace Listener" />
</listeners>
</add>
</categorySources>
Run Code Online (Sandbox Code Playgroud)
如果没有解决,调用ExceptionPolicy.HandleException将生成:
未在托管服务或Development Fabric中运行.
要根据应用程序的运行位置有条件地删除它,我们可以使用EL5的流畅配置API,但必须重写我们的配置(它是全部或全部).
我们也可以使用web.config转换,除了已经有3种不同的解决方案配置(例如,dev,staging,production)之外,我们必须引入第4个来区分dev-standalone和dev-azure.
最后一个选择是创建一个自定义侦听器,它将所有消息路由到****(如果在Azure上运行)或什么都不做.
还有其他建议吗?
仅供参考,ASP.NET运行状况监视配置如下:
<healthMonitoring enabled="true">
<providers>
<add name="TraceWebProvider" type="System.Web.Management.TraceWebEventProvider" />
</providers>
<rules>
<add name="Application Events"
eventName="Application Lifetime Events"
provider="TraceWebProvider"
profile="Default"
minInstances="1"
maxLimit="Infinite"
minInterval="00:01:00" />
</rules>
</healthMonitoring>
Run Code Online (Sandbox Code Playgroud) MySpace.com的首席系统架构师Dan Farino 发表了精彩的演示,展示了一个基于Web的堆栈转储工具,该工具对在给定流程中运行的所有线程进行编目(他们正在做什么,他们执行了多长时间等等) .)
他们的技术也在highscalability.com上进行了总结:
问题是:为ASP.NET构建基于Web的堆栈转储工具需要哪些工具?为方便起见,我们假设在目标AppDomain中托管的*.aspx能够输出该进程中的所有托管调用堆栈就足够了.
有一些帖子涵盖了Mdbg的使用(完全用C#/ IL编写的托管代码的调试器,开始随CLR 2 SDK一起提供)和mdbgcore程序集通常位于C:\ Program Files\Microsoft Visual Studio 8\SDK\2.0 \斌:
解决方案是否会简单地引用此组件以产生所需的输出?"列出所有托管调用堆栈"操作对正在为生产流量提供服务的运行进程有什么影响?
我们试图ConfigurationManager在构建时标记外部类型(如 )的使用。
自定义代码分析字典可以提供帮助 [1],但仅限于项目中包含源代码的情况。同样,该Obsolete属性适用于项目中包含的类型。
我什至不确定代码分析规则是否能够检查方法体?[2]。
关于如何在构建时标记外部类型/方法的使用有什么建议吗?
[1] - http://msdn.microsoft.com/en-us/library/bb514188.aspx
[2] - http://msdn.microsoft.com/en-us/library/dd172127(v=vs.90).aspx
我想按照预定的时间表运行一个Azure实例(例如,美国东部时间晚上9点到周五,周一至周五),以减少计费,我想知道最好的方法是什么.
问题的两个部分:
[1] - http://blogs.msdn.com/b/gonzalorc/archive/2010/02/07/auto-scaling-in-azure.aspx
例如,jQuery中是否存在尚未在最新版本中解决的任何漏洞(2)?安全包将标记库不安全的任何其他正当理由?
这个问题与(1)有关,但性质更广泛.
(1) - jQuery漏洞(NVD CVE-2007-2379)
(2) - http://www.networkworld.com/news/2007/040207-javascript-ajax-applications.html
我正在使用大型数据集,有些语句需要30-70分钟才能执行,这是一个令人沮丧的月份!
我只是想知道......有没有一个可靠的原因,SQL实现通常不报告单个执行计划的进展?或者只是对大多数人来说这不够重要?
请赐教我.