Asp 缓存技术 sql
2008年07月16日 星期三 1:18
用了缓存,其实就是由原来的:响应->执行->送显,变成: 响应->送显。中间的“执行”就省掉了,提高了效率。一般有四种类型的缓存技术。 一.Output Caching 由于IIS的一些特性,默认情况下Output Cache是打开的,但是要对某些请求进行缓存,还需要开发者进行定制,而且默认情况下,Output Cache 会被缓存到硬盘上,我们可以通过修改DiskCacheable的属性来设置其是否缓存,还可以通过Web config里配置缓存文件的大小。 <%@ OutputCache Duration="3600" VaryByParam="state" DiskCacheable="true" %> 一般用硬盘缓存是考虑到页面送显的数据比较大,相对内存缓存来说,它的容量大,但是访问速度慢点,如果把周期设太短,使用硬盘缓存的效率就不大好。 对于Output Cache的定制,有两种方法,一种是基于底层的API技术,一种是基于高层的@OutputCaching: 1.基于高层的@OutputCaching A.由参数改变缓存内容:有些时候我们需要根据用户的请求来生成页面,但是用户的请求只有有限的几种组合,这个时候就可以根据用户请求来生成几种缓存页面,来进行缓存。 <%@ OutputCache Duration = "60" VaryByParam = "state" %> <asp:SqlDataSource ID="SqlDataSource1" runat="server"> <SelectParameters> <asp:QueryStringParameter Name="state" QueryStringField="state" DefaultValue="CA" /> </SelectParameters> </asp:SqlDataSource> B.回调缓存:可以针对每个请求在页面中插入动态的部分,以弥补单独使用静态缓存的不足: 动态的部分用Substitution控件,Substitution控件是一个容器 <asp:Substitution ID="Substitution1" runat="server" MethodName ="" /> MethodName 里面放入要调用的方法内容。 2. 使用API定制缓存: 通过设置System.Web.HttpCachePolicy属性来进行配置 <%@ OutputCache Duration="60" VaryByParam="none" %> 就可以写成 Response.Cache.SetExpires(DateTime.Now.AddSeconds(60)); Response.Cache.SetCacheability(HttpCacheability.Public); 二.Fragment Caching 作为Output的缓存的附加功能,还提供一种缓存技术,专门用于缓存用户控件。在用户控件中设置: <%@ OutputCache Duration="60" VaryByParam="none" %> 但在引用用户控件的页面不设置缓存。这样的话,页面中除了用户控件是静态的,其他都是动态的。 缓存用户空间同样还可以使用控件作为参数来源。通过指定控件作为缓存控件的数据来源,可以达到缓存控件数据的目的,和上面一样。 三.Data Caching Asp提供了一种非常快捷的方法进行数据库缓存,用户可以非常简单方便的对页面变量进行缓存。并以此提高程序效率。一个页面变量的缓存生命周期与应用程序的缓存生命周期相同 实现是把数据放在Cache中,如: source = new DataView(ds); Cache("MyCache") = source; MyCache这个变量其实就是一个XML文件。 四.SQL Caching 通过配置数据库连接池,只有当数据库数据被改变的时候,缓存才会改变。 开个DOS窗口: C:\>dir /s ——这个文件是专门注册SQL连接池的,它对SQL Sever 7.0以上都有专门的支持,我们通过写一些专门的语句来配置这个注册连接池,可以把连接池和本地的应用程序(Asp服务器,即IIS)做一个连 接。连接池只能监视有限的几个库,不然连接池的负载太大。使用SQL Caching: 先注册,如: -S".\SQLExpress"-E-d"pubs"-ed -S".\SQLExpress"-E-d"pubs"-et-t"authors" 其中:- S".\SQLExpress" 表示要使用的SQL Server实例为".\SQLExpress"。-E 表示使用当前windows凭证进行身份验证。-d"pubs" 表示用于应用程序服务的数据库名称叫"pubs"。-ed表示为SQL 缓存依赖项启用数据库。-et 表示为SQL 缓存依赖项启用表。-t"authors"表的名称为"authors"。 然后页面上: <%@ OutputCache Duration="99999999" VaryByParam="none" SqlDependency="Pubs.Authors" %> 就OK了。 |
将 ASP.NET 输出缓存与 SQL Server 结合使用
2008年07月16日 星期三 1:25
此演练演示如何缓存依赖于 SQL Server 数据库中数据的 ASP.NET 页。 ASP.NET 输出缓存的一项高级功能是 SQL 缓存依赖项。SQL 缓存依赖项使您可以缓存依赖于 SQL Server 表中数据的页。您可以配置 SQL Server 和 ASP.NET 以缓存页请求,降低服务器工作负荷,直到页所依赖的数据已在 SQL Server 中更新为止。对于相对保持静态的产品目录或客户注册信息等数据而言,SQL 缓存依赖项很有用。 本演练中阐释的任务包括: ∙ 创建并配置页,以显示 Northwind 数据库中的数据。 ∙ 为 SQL 缓存通知启用数据库。 ∙ 在页以及 fig 文件中指定 SQL 缓存依赖项。 ∙ 对 Northwind 数据库进行更改并查看缓存行为。 先决条件 若要完成本演练,您需要: ∙ 对具有 Northwind 数据库的 SQL Server 2000 或 SQL Server 2005 的访问。 ∙ SQL Server Northwind 数据库的访问权限。有关下载和安装 SQL Server 示例数据库 Northwind 的信息,请参见位于 Microsoft SQL Server 网站上的“Installing Sample Databases”(安装示例数据库)。
∙ Microsoft 数据访问组件 (MDAC) 2.7 版或更高版本。 如果您使用的是 Windows XP 或 Windows Server 2003,那么您已经有了 MDAC 2.7。但是,如果使用 Windows 2000,您可能需要升级您计算机上已经安装的 MDAC。有关更多信息,请参见 MSDN 文章“MDAC Installation”(MDAC 安装)。 ∙ .NET Framework 2.0 版。 创建网站 如果您已在 Visual Web Developer 中创建了网站(请参见 演练:在 Visual Web Developer 中创建基本网页),则可以使用该网站并转至本演练的后面部分“为 SQL Server 启用缓存通知”。否则,按照下面的步骤创建一个新的网站和网页。 创建文件系统网站 1. 打开 Visual Web Developer。 2. 在“文件”菜单上单击“新建网站”。(在 Visual Web Developer 速成版中,在“文件”菜单上单击“新建”,然后单击“网站”。) 出现“新建网站”对话框。 3. 在“Visual Studio 已安装的模板”之下单击“ASP.NET 网站”。 4. 在“位置”框中输入要保存网站页面的文件夹的名称。 例如,键入文件夹名 C:\WebSites。 5. 在“语言”列表中,单击您想使用的编程语言。 6. 单击“确定”。 Visual Web Developer 创建该文件夹和一个名为 Default.aspx 的新页。 为 SQL Server 启用缓存通知 必须配置 SQL Server 以就依赖数据中的更改向 ASP.NET 提供合适的通知。您需要具有管理特权才能配置服务器。 为 SQL Server 启用缓存通知 1. 在 Windows“启动”菜单中,指向“所有程序”,指向“附件”,然后单击“命令提示符”以打开命令提示窗口。 2. 在磁盘驱动器中到 可执行文件。此文件随 .NET Framework 2.0 版安装在下面的位置: 复制代码 %windir%\Microsoft.NET\Framework\FrameworkVersion 确保 %windir% 表示 Windows 目录并且 .NET Framework 版本为 2.0 或更高版本。该路径可能看起来类似于下面这样: 复制代码 C:\WINDOWS\Microsoft.NET\Framework\v2.0.40217 3. 使用下面的命令为 Northwind 数据库中的 Employees 表启用缓存通知: 复制代码 -S <Server> -U <Username> -P <Password> -ed -d Northwind -et -t Employees
将出现一条消息,指示启用数据库的成功与失败。下面的消息指示成功: 复制代码 Enabling the table for SQL cache dependency. .. Finished. 向项目中添加数据连接 要在 Visual Web Developer 中使用 SQL Server 数据库,您需要向 Northwind 数据库添加连接。 向项目添加数据源 1. 在“服务器资源管理器”(Visual Web Developer 速成版中为“数据库资源管理器”)中,右击“数据连接”,然后单击“添加连接”。
2. 如果“服务器资源管理器”(Visual Web Developer 速成版中为“数据库资源管理器”)不可见,则在“视图”菜单中单击“服务器资源管理器”(Visual Web Developer 速成版中为“数据库资源管理器”)。 3. 如果显示“选择数据源”对话框,则执行以下操作: 1. 在“数据源”列表中,单击“Microsoft SQL Server”。 2. 在“数据提供程序”列表中,单击“用于 SQL Server 的 .NET Framework 数据提供程序”。 3. 单击“继续”。 4. 在“添加连接”对话框中,为数据库提供详细信息(服务器名称、登录凭据等),然后选择 Northwind 数据库。 5. 单击“确定”。 向网页添加时间戳和数据 现在可以创建网页来演示缓存处理。在本节中,您将添加一个时间戳来跟踪页创建时间,并添加一个 GridView 控件来查看 Northwind 数据库的 Employees 表。 向网页添加时间戳和数据 1. 切换到或打开 Default.aspx 页。 2. 切换到“设计”视图。 3. 从工具箱的“标准”组中,将一个 Label 控件拖到页上,保留默认名称 Label1。 4. 在“服务器资源管理器”(Visual Web Developer 速成版中为“数据库资源管理器”)中,展开“数据连接”。 5. 为以前创建的数据连接展开节点。 6. 展开“表”节点。 7. 将 Employees 表拖到页上。 Visual Web Designer 创建一个 GridView 控件,它配置为使用您所选择的连接和表。 8. 在“GridView 任务”菜单上,单击“配置数据源。 默认数据连接字符串名称 NorthwindConnectionString1 出现在“配置数据源”向导的第一个步骤中。 9. 单击“下一步”。 10. 在“配置 Select 语句”窗格中,选择“指定来自表或视图的列”。 11. 在“名称”列表中,单击 Employees。 12. 在“列”列表中,选择 EmployeeID、LastName 和 FirstName 列。 13. 单击“下一步”。 14. 单击“完成”。 Visual Web Designer 配置 GridView 控件以显示您所选择的数据。
15. 双击页的空白部分。 设计器生成 Page_Load 方法并切换视图。 16. 添加以下突出显示的代码,以显示指示页创建的时间戳: Visual Basic 复制代码 Protected Sub Page_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) _ Handles Me.Load Label1.Text = System.DateTime.Now End Sub C# 复制代码 protected void Page_Load(Object sender, System.EventArgs e) { Label1.Text = System.DateTime.Now.ToString(); } 17. 保存该文件。 测试不使用缓存功能的页 现在可以运行页,并观察不使用缓存功能的行为。此时将加载页并显示当前服务器时间,然后将检索数据并将其放置在页中。 测试不使用缓存功能的页 1. 按 Ctrl+F5 运行该页。 2. 在浏览器中刷新页 注意,时间戳随着每次页刷新而更改。数据将保持相同。 为缓存功能配置网页 在本部分演练中,您将基于 Northwind 数据库的 Employees 表为 SQL 缓存依赖项配置页。 为缓存功能配置网页 1. 切换到“源”视图。 2. 在页顶部,添加下面的指令以指示依赖项: 复制代码 <%@ OutputCache Duration="3600" SqlDependency="Northwind:Employees" VaryByParam="none" %> VaryByParam 属性指示缓存时 ASP.NET 是否应考虑页参数(如查询字符串或发布值)。当 VaryByParam 设置为 none 时,将不考虑任何参数;无论提供什么附加参数,都将向所有用户发送相同的页。将 VaryByParam 设置为 *(星号)表明,对于每个唯一的请求参数组合,将缓存一个唯一页。但是,将 VaryByParam 设置为 *会缓存页的许多不同版本,所以如果您知道缓存变化所依据的参数,建议您在 VaryByParam 属性中显式指定这些参数。有关详细信息,请参见 缓存页的多个版本。 在 fig 文件中设置缓存配置 除了前面部分中网页的 OutputCache 声明外,您需要在 fig 文件中指定缓存详细信息。 创建和更新 fig 文件 1. 如果您的网站已具有 fig 文件,请转至步骤 4。 2. 在解决方案资源管理器中,右击网站的名称,然后单击“添加新项”。 3. 在“添加项”对话框中,单击“Web 配置文件”,然后单击“添加”。 请确保使用名称 fig。 4. 将下面的 XML 作为 system.web 元素的子级添加到 fig 文件中: 复制代码 <caching> <sqlCacheDependency enabled = "true" pollTime = "1000" > <databases> <add name="Northwind" connectionStringName="NorthwindConnectionString1" pollTime = "1000" /> </databases> </sqlCacheDependency> </caching>
5. 保存文件,然后将其关闭。 测试使用缓存功能的页 启用缓存后,刷新页时将不再导致时间戳或数据库查询更新,因为 ASP.NET 将从缓存中满足页请求。 测试使用缓存功能的页 ∙ 按 Ctrl+F5 运行该页。 注意,时间戳在每次页刷新时保持不变。将从缓存中检索页。 更改数据 现在可以更改数据库中的数据,并可看到缓存被验证,并创建了一个新页。 更改数据 1. 在“服务器资源管理器”(Visual Web Developer 速成版中为“数据库资源管理器”中),展开“数据连接”节点。 2. 展开您先前创建的连接。 3. 展开“表”节点。 4. 右击“Employees”,然后单击“显示表数据”。 5. 通过编辑数据表中的任何字段并确保它是网页所显示的字段来更新数据库。 或者也可以使用 SQL 窗格(如果 SQL 窗格不可见,则在“查询设计器”菜单中单击“窗格”,然后单击“SQL”)。直接输入 SQL 命令,然后单击“查询设计器”工具栏中的“执行 SQL”按钮。例如,运行下面的命令: 复制代码 UPDATE dbo.Employees SET LastName = 'Doe' WHERE (EmployeeID = 5) 这将把雇员 5 的名称更改为 Doe。 6. 关闭数据的视图。 测试 SQL 缓存依赖项 现在可以测试页,以查看数据和时间戳是否已更改。 测试 SQL 缓存依赖项 1. 按 Ctrl+F5 运行该页。 注意,时间戳已更改,并显示新数据。 2. 按 Ctrl+F5 再次运行该页。 这次时间戳保持不变,因为数据未更改,并且现在正从缓存中再次检索该页。 后续步骤 也可以使用其他参数来缓存页。有关信息,请参见 演练:使用输出缓存增强网站性能。如果您不熟悉数据访问,请参见 演练:网页中的基本数据访问。 请参见 概念 使用 SqlCacheDependency 类在 ASP.NET 中缓存 参考 DefaultHttpCachePolicy OutputCacheSettingsSection msdn.microsoft/zh-cn/library/e3w8402y.aspx | |||||||||||||||||
SQL2005执行缓存的效率
Posted on 2008-03-02 15:20 ∈鱼杆 阅读(338) 评论(1) 编辑 收藏
这篇文章昨天就写好了。但感觉就是没把问题说明白,大家看了反而会糊涂。可能是题目范围太广,要准确的清楚,显得有些困然。如果要我写个5、6篇文章说明这个问题,我觉得累啥!最后就决定采用QA的方式,来避免题目太广的麻烦。说是QA,其实这个Q也是我,A也是我,自问自答啦!(YY:本来想MM顶替Q的角,我担心她会问出这样的问题“你什么时候做中饭啊!”,想想算了,我就不麻烦她啦。(*^__^*))
平时大家都知道参数化查询好,存储过程好,这里具体分析一下到底为什么好。而且这个好处不但是编译,还可以节约MSSQL占用的内存。作为开发人员和系统设计人员,应该了解到这层就够了,更深入的就交给DBA去完成啦!
QA集锦:
Q:什么是执行缓存。
A:具体大家google。我简单说一下:就是MSSQL对一些可以重复使用的过程、语句进行存
A:具体大家google。我简单说一下:就是MSSQL对一些可以重复使用的过程、语句进行存
储,减少相同过程、语句的重新编译(PS:语法、语义、执行计划等的分析)。举个不太恰当的比喻:
A到了一家新公司E。
第一天上班。因为只知道大概方向,所以A早起开始探路。A->B公交站->C地铁站->D公交站->E公司.A现在知道到公司的路线了(记忆在人脑中)
第二天上班。A不需要早起,按昨天的路线(记忆在大脑中)就可以到公司了。
那么执行缓存其实就是(记忆在大脑中)的这个东西,一旦MSSQL,发现有相同的存储过程、或是SQL语句,它就可以直接运行,而不需要在进行语义、语法分析等。
A到了一家新公司E。
第一天上班。因为只知道大概方向,所以A早起开始探路。A->B公交站->C地铁站->D公交站->E公司.A现在知道到公司的路线了(记忆在人脑中)
第二天上班。A不需要早起,按昨天的路线(记忆在大脑中)就可以到公司了。
那么执行缓存其实就是(记忆在大脑中)的这个东西,一旦MSSQL,发现有相同的存储过程、或是SQL语句,它就可以直接运行,而不需要在进行语义、语法分析等。
Q:上文有提到“相同”,那么MSSQL是如何判断存储过程(SP)、语句是相同的呢?
A:通过HashCode 哈希值来判断是否相等。有的地方也称为SQL句柄。如果他们的哈希值相同,那么就是同一个存储过程、语句。(PS:存储过程好像是根据名字来的,比如 dbo.Test1,其实他们的哈希值也是一样的啦)。MS提供一个方法 sys.dm_exec_sql_text 将哈希值转换为SQL语句噢,下面的方法就会用到这个函数!不过我没到如何将一个SQL语句转换为SQL句柄的方法,有知道的告诉我一下。(PS:C# 有一个GetHashCode方
A:通过HashCode 哈希值来判断是否相等。有的地方也称为SQL句柄。如果他们的哈希值相同,那么就是同一个存储过程、语句。(PS:存储过程好像是根据名字来的,比如 dbo.Test1,其实他们的哈希值也是一样的啦)。MS提供一个方法 sys.dm_exec_sql_text 将哈希值转换为SQL语句噢,下面的方法就会用到这个函数!不过我没到如何将一个SQL语句转换为SQL句柄的方法,有知道的告诉我一下。(PS:C# 有一个GetHashCode方
法,道理是一样的)。
Q:知道如何判断相同,那么这些相同的存储过程(SP)、语句存储在哪里呢。
A:你就是想知道这些缓存的内容放在什么地方是吧!MS说这是一张虚拟表。这个我就不深究了,我提供两个语句(PS:语句并非原创),你可以看到具体的缓存内容。
1:sys.dm_exec_cached_plans
Select TOP 100 usecounts,objtype,p.size_in_bytes,[sql].[text] FROM sys.dm_exec_cached_plans p OUTER APPLY sys.dm_exec_sql_text (p.plan_handle) sql
2:sys.dm_exec_query_stats
SELECT TOP 100
qs.execution_count,
DatabaseName = DB_NAME(qp.dbid),
--ObjectName = OBJECT_NAME(qp.objectid,qp.dbid),
StatementDefinition =
SUBSTRING (
st.text,
A:你就是想知道这些缓存的内容放在什么地方是吧!MS说这是一张虚拟表。这个我就不深究了,我提供两个语句(PS:语句并非原创),你可以看到具体的缓存内容。
1:sys.dm_exec_cached_plans
Select TOP 100 usecounts,objtype,p.size_in_bytes,[sql].[text] FROM sys.dm_exec_cached_plans p OUTER APPLY sys.dm_exec_sql_text (p.plan_handle) sql
2:sys.dm_exec_query_stats
SELECT TOP 100
qs.execution_count,
DatabaseName = DB_NAME(qp.dbid),
--ObjectName = OBJECT_NAME(qp.objectid,qp.dbid),
StatementDefinition =
SUBSTRING (
st.text,
(
qs.statement_start_offset / 2
) + 1,
(sql连接不上服务器
(
CASE qs.statement_end_offset
WHEN -1 THEN )
ELSE qs.statement_end_offset
END - qs.statement_start_offset
) / 2
) + 1
),
query_plan,
st.text, total_elapsed_time
FROM sys.dm_exec_query_stats AS qs
qs.statement_start_offset / 2
) + 1,
(sql连接不上服务器
(
CASE qs.statement_end_offset
WHEN -1 THEN )
ELSE qs.statement_end_offset
END - qs.statement_start_offset
) / 2
) + 1
),
query_plan,
st.text, total_elapsed_time
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
CROSS APPLY sys.dm_exec_query_plan (qs.plan_handle) qp
WHERE
st.encrypted = 0
ORDER ution_count DESC
CROSS APPLY sys.dm_exec_query_plan (qs.plan_handle) qp
WHERE
st.encrypted = 0
ORDER ution_count DESC
第一个方法看的内容不多,第二个方法看的内容更加详细。为什么留两个,实践一下。哈哈,看到当前的执行缓存了吧,兴奋啊!原来MSSQL大脑里就记忆了这些。有了这些大家其实也可以明白,这对于SQL语句效率的优化可是个好东西。execution_count数,当然是重复利用率越高越好了。在看看StatementDefinition,如果有很多相同或类似的证明的执行缓存重覆率太高,而且这样也消耗了大量的MSSQL内存。
方法一截图:
方法二截图:
方法二截图:
Q:那能不能清空当前的执行缓存呢?因为这样方便调试,要不一堆数据无法查看新增的执行缓存啊。
A:恩,不错,想法很好。但这个操作不能随便在生产环境运行,这样很可能造成系统效率问题。警告完了,告诉语句:dbcc freeproccache
A:恩,不错,想法很好。但这个操作不能随便在生产环境运行,这样很可能造成系统效率问题。警告完了,告诉语句:dbcc freeproccache
Q:等等!再问个问题,如何查看当前使用的执行缓存呢?这样也方便调试啊,可以看到缓存的变化情况啊!
A: dbcc memorystatus,具体如图:
A: dbcc memorystatus,具体如图:
Q: 还有.....
A:打住!不耐烦了,我说最后一句。大家也可以通过SQL Profiler查看到缓存的相关动作。图上列举的Event不全,大家可以通过设置得到更多的事件。有些事件我也没太明白,用空在具体分析吧!
A:打住!不耐烦了,我说最后一句。大家也可以通过SQL Profiler查看到缓存的相关动作。图上列举的Event不全,大家可以通过设置得到更多的事件。有些事件我也没太明白,用空在具体分析吧!
总结:
说白了就是MSSQL将很多相同的语句进行保留,一旦发现相同的语句,就直接运行,而不需要去分析和处理。这样也就很自然的提高了效率。减少重复自然就减少SQL内存的占用。 对于一个高用户访问的网站,这个开销还是可观的。
实践:
给大家留下一个问题:下面三个存储过程,在执行缓存中有什么不同(PS:效率上的,文字上我也知道不同)。如果你实践了,应该就明白了。
CREATE PROCEDURE dbo.Test1
@CategoryID uniqueidentifier
AS
BEGIN
SET NOCOUNT ON
SELECT * FROM be_CateGories WHERE CategoryID = @CategoryID
END
@CategoryID uniqueidentifier
AS
BEGIN
SET NOCOUNT ON
SELECT * FROM be_CateGories WHERE CategoryID = @CategoryID
END
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论