提高SQL Server性能的五种方法

有时,为了让应用程序运行得更快,所做的全部工作就是在这里或那里做一些很小调整。但关键在于确定如何进行调整!迟早您会遇到这种情况:应用程序中的SQL查询不能按照您想要的方式进行响应。它要么不返回数据,要么耗费的时间长得出奇。如果它降低了企业应用程序的速度,用户必须等待很长时间。用户希望应用程序响应迅速,他们的报告能够在瞬间之内返回分析数据。就我自己而言,如果在Web上冲浪时某个页面要耗费十多秒才能加载,我也会很不耐烦。

为了解决这些问题,重要的是找到问题的根源。那么,从哪里开始呢?根本原因通常在于数据库设计和访问它的查询。我将讲述五项技术,这些技术可用于提高基于SQL Server的应用程序的性能或改善其可伸缩性。我将仔细说明LEFT join、CROSS join的使用以及IDENTITY值的检索。请记住,根本没有神奇的解决方案。调整您的数据库及其查询需要占用时间、进行分析,还需要大量的测试。这些技术都已被证明行之有效,但对您的应用程序而言,可能其中一些技术比另一些技术更适用。

一、从insert返回IDENTITY

我决定从遇到许多问题的内容入手:如何在执行SQL insert后检索IDENTITY值。通常,问题不在于如何编写检索值的查询,而在于在哪里以及何时进行检索。在SQL Server中,下面的语句可用于检索由最新在活动数据库连接上运行的 SQL 语句所创建的IDENTITY 值:

select @@IDENTITY

这个SQL语句并不复杂,但需要记住的一点是:如果这个最新的SQL语句不是insert,或者您针对非insert SQL的其他连接运行了此SQL,则不会获得期望的值。您必须运行下列代码才能检索紧跟在 insert SQL 之后且位于同一连接上的 IDENTITY,如下所示:

insert INTO Products (ProductName) VALUES (’Chalk’)
select @@IDENTITY
在一个连接上针对Northwind数据库运行这些查询将返回一个名称为Chalk的新产品的IDENTITY值。所以,在使用ADOVisual Basic应用程序中,可以运行以下语句:
Set oRs = oCn.execute("SET NOcount ON;insert INTO Products _
(ProductName) VALUES (’Chalk’);select @@IDENTITY")
lProductID = oRs(0) 

此代码告诉SQL Server不要返回查询的行计数,然后执行insert语句,并返回刚刚为这个新行创建的IDENTITY值。SET NOcount ON语句表示返回的记录集有一行和一列,其中包含了这个新的 IDENTITY 值。如果没有此语句,则会首先返回一个空的记录集(因为 insert语句不返回任何数据),然后会返回第二个记录集,第二个记录集中包含 IDENTITY 值。这可能有些令人困惑,尤其是因为您从来就没有希望过 insert 会返回记录集。之所以会发生此情况,是因为 SQL Server 看到了这个行计数(即一行受到影响)并将其解释为表示一个记录集。因此,真正的数据被推回到了第二个记录集。当然您可以使用 ADO 中的 NextRecordset 方法获取此第二个记录集,但如果总能够首先返回该记录集且只返回该记录集,则会更方便,也更有效率。

此方法虽然有效,但需要在SQL语句中额外添加一些代码。获得相同结果的另一方法是在insert之前使用SET NOcount ON语句,并将select @@IDENTITY语句放在表中的 FOR insert触发器中,如下面的代码片段所示。这样,任何进入该表的 insert 语句都将自动返回 IDENTITY 值。

create TRIGGER trProducts_insert ON Products FOR insert AS

select @@IDENTITY

GO

触发器只在Products表上发生insert时启动,所以它总是会在成功insert之后返回一个IDENTITY。使用此技术,您可以始终以相同的方式在应用程序中检索IDENTITY值。

二、内嵌视图与临时表

某些时候,查询需要将数据与其他一些可能只能通过执行GROUP BY然后执行标准查询才能收集的数据进行联接。例如,如果要查询最新五个定单的有关信息,您首先需要知道是哪些定单。这可以使用返回定单ID的SQL查询来检索。此数据就会存储在临时表(这是一个常用技术)中,然后与Products表进行联接,以返回这些定单售出的产品数量:

create TABLE #Temp1 (OrderID INT NOT NULL, _
OrderDate DATETIME NOT NULL)
insert INTO #Temp1 (OrderID, OrderDate)
select TOP 5 o.OrderID, o.OrderDate
FROM Orders o ORDER BY o.OrderDate DESC
select p.ProductName, SUM(od.Quantity) AS ProductQuantity
FROM #Temp1 t
INNER join [Order Details] od ON t.OrderID = od.OrderID
INNER join Products p ON od.ProductID = p.ProductID
GROUP BY p.ProductName
ORDER BY p.ProductName
drop TABLE #Temp1

时间: 2025-01-24 19:45:42

提高SQL Server性能的五种方法的相关文章

浅谈基于SQL Server分页存储过程五种方法及性能比较

在SQL Server数据库操作中,我们常常会用到存储过程对实现对查询的数据的分页处理,以方便浏览者的浏览. 创建数据库data_Test : create database data_Test GO use data_Test GO create table tb_TestTable --创建表 ( id int identity(1,1) primary key, userName nvarchar(20) not null, userPWD nvarchar(20) not null, u

访问 Microsoft SQL Server 元数据的三种方法

server|访问|数据 访问 Microsoft SQL Server 元数据的三种方法 上海微创软件有限公司 肖桂东 适用读者:Microsoft SQL Server 中.高级用户 元数据简介 元数据 (metadata) 最常见的定义为"有关数据的结构数据",或者再简单一点就是"关于数据的信息",日常生活中的图例.图书馆目录卡和名片等都可以看作是元数据.在关系型数据库管理系统 (DBMS) 中,元数据描述了数据的结构和意义.比如在管理.维护 SQL Serv

Odbc连SQL Server数据库的几种方法

odbc|server|数据|数据库 Odbc连SQL Server数据库的几种方法   这篇文章是针对在CSDN论坛 中的一些想知道这方面技术的网友而写的.因为最近我本人在论坛上看到很多网友提到这个问题,所以就写了这篇文章,以飨读者. SQL Server 是一种高效的关系数据库系统,它与Windows NT/2000及Windows 9x等操作系统紧密集成.也是今天市场上几种大型关系型数据库(SQL Server\Oracle ybase等)之一.对于今天复杂的B/S服务器系统来说,SQL

SQL Server 性能优化之——系统化方法提高性能

原文http://www.cnblogs.com/BoyceYang/archive/2013/06/15/3138142.html 阅读导航 1. 概述 2. 规范逻辑数据库设计 3. 使用高效索引设计 4. 使用高效的查询设计 5. 使用技术分析低性能 6. 总结   1. 概述 在比较大的范围内找出能够大幅提高性能的区域,并且专注于分析这个区域,这是最有效的优化SQL Server性能的方式.否则,大量的时间和精力可能被浪费在不能提高很大性能的区域.在这里并没有讨论关于多用户并发所带来的性

Oracle提高SQL执行效率的3种方法_oracle

Oracle提供了多种方法用于减少花在剖析Oracle SQL表达式上的时间,在执行带有大量执行计划的复杂查询时剖析过程会拖累系统的性能.现在我们来简要地看看这些方法中的几种. 1.使用ordered提示 Oracle必须花费大量的时间来剖析多表格的合并,用以确定表格合并的最佳顺序.如果SQL表达式涉及七个乃至更多的表格合并,那么有时就会需要超过30分钟的时间来剖析,因为Oracle必须评估表格合并所有可能的顺序.八个表格就会有40,000多种顺序.Ordered这个提示(hint)和其他的提示

提高 SQL 性能的五种方法

sql|性能 有时, 为了让应用程序运行得更快,所做的全部工作就是在这里或那里做一些很小调整.啊,但关键在于确定如何进行调整!迟早您会遇到这种情况:应用程序中的 SQL 查询不能按照您想要的方式进行响应.它要么不返回数据,要么耗费的时间长得出奇.如果它降低了报告或您的企业应用程序的速度,用户必须等待的时间过长,他们就会很不满意.就像您的父母不想听您解释为什么在深更半夜才回来一样,用户也不会听你解释为什么查询耗费这么长时间.("对不起,妈妈,我使用了太多的 LEFT JOIN.")用户希

提高CSS文件可维护性的五种方法

当完成一项前端的工作之后,许多人都会忘记该项目的结构与细节.然而代码并不是马上就能完全定型,在余下的时间里还有不断的维护工作,而这些工作也许不会是你自己完成.所以,结构优良的代码能很大程度上优化它的可维护性.下面列出五种提高CSS文件可维护性的方法,也就是一种较好的CSS样式指南. 1.分解你的样式 对于小项目,在写代码之前,按页面结构或页面内容将代码分为几块并给予注释.例如,可以分别将 全局样式.布局.字体样式.表单.评论和其他分为几个不同的块来继续工作. 而对于较大的工程,这样显然不会有什么

ASP创建SQL Server数据库的两种方法

server|创建|数据|数据库 <% ************ 使用ADODB.Connect对象创建 ************************Dim oConnDim sDatabaseNamesDatabaseName = "CodeCreateDB"Set oConn = Server.CreateObject("ADODB.Connection")oConn.Open "Provider=SQLOLEDB;Data Source=(

DBCC DBREINDEX重建索引提高SQL Server性能

1. 索引的体系结构 为什么要不断的维护表的索引?首先,简单介绍一下索引的体系结构.SQL Server在硬盘中用8KB页面在数据库文件内存放数据.缺省情况下这些页面及其包含的数据是无组织的.为了使混乱变为有序,就要生成索引.生成索引后,就有了索引页和数据页,数据页保存用户写入的数据信息.索引页存放用于检索列的数据值清单(关键字)和索引表中该值所在纪录的地址指针.索引分为簇索引和非簇索引,簇索引实质上是将表中的数据排序,就好像是字典的索引目录.非簇索引不对数据排序,它只保存了数据的指针地址.向一