原文 http://dreams75.iteye.com/blog/474864
最好的改进光标性能的技术就是:能避免时就避免使用游标。
——摘自《Transact-SQL权威指南》 Ken Henderson[著]
最好的改进光标性能的技术就是:能避免时就避免使用游标。SQL Server是关系数据库,其处理数据集比处理单行好得多,单独行的访问根本不适合关系DBMS。若有时无法避免使用游标,则可以用如下技巧来优化游标的性能。
(1).
除非必要否则不要使用static/insensitive游标。打开static游标会造成所有的行都被拷贝到临时表。这正是为什么它对变化不敏感的原
因——它实际上是指向临时数据库表中的一个备份。很自然,结果集越大,声明其上的static游标就会引起越多的临时数据库的资源争夺问题。
(2). 除非必要否则不要使用keyset游标。和static游标一样,打开keyset游标会创建临时表。虽然这个表只包括基本表的一个关键字列(除非不存在唯一关键字),但是当处理大结果集时还是会相当大的。
(3). 当处理单向的只读结果集时,使用fast_forward代替forward_only。使用fast_forward定义一个forward_only,则read_only游标具有一定的内部性能优化。
(4). 使用read_only关键字定义只读游标。这样可以防止意外的修改,并且让服务器了解游标移动时不会修改行。
(5). 小心事务处理中通过游标进行的大量行修改。根据事务隔离级别,这些行在事务完成或回滚前会保持锁定,这可能造成服务器上的资源争夺。
(6).
小心动态光标的修改,尤其是建在非唯一聚集索引键的表上的游标,因为他们会造成“Halloween”问题——对同一行或同一行的重复的错误的修改。因为
SQL
Server在内部会把某行的关键字修改成一个已经存在的值,并强迫服务器追加下标,使它以后可以再结果集中移动。当从结果集的剩余项中存取时,又会遇到
那一行,然后程序会重复,结果造成死循环。
(7). 对于大结果集要考虑使用异步游标,尽可能地把控制权交给调用者。当返回相当大的结果集到可移动的表格时,异步游标特别有用,因为它们允许应用程序几乎马上就可以显示行。
Halloween:
-
CREATE
Table
#T(
-
k1 int
identity(1,1),
-
c1 int
null
-
);
-
-
CREATE
CLUSTERED
INDEX
C1
ON
#T(C1);
-
-
INSERT
INTO
#T(C1)
VALUES
(8)
-
INSERT
INTO
#T(C1)
VALUES
(6)
-
INSERT
INTO
#T(C1)
VALUES
(7)
-
INSERT
INTO
#T(C1)
VALUES
(5)
-
INSERT
INTO
#T(C1)
VALUES
(3)
-
INSERT
INTO
#T(C1)
VALUES
(0)
-
INSERT
INTO
#T(C1)
VALUES
(9)
-
-
-
DECLARE
C
CURSOR
DYNAMIC
-
FOR
SELECT
K1,C1
FROM
#T;
-
-
OPEN
C
-
FETCH
C
-
WHILE(@@FETCH_Status=0)
-
BEGIN
-
UPDATE
#T
SET
C1=C1+1
-
WHERE
CURRENT
OF
C;
-
FETCH
C;
-
END
-
-
CLOSE
C;
-
DEALLOCATE
C;
-
-
DROP
Table
#T;
-
GO
CREATE Table #T(
k1 int identity(1,1),
c1 int null
);
CREATE CLUSTERED INDEX C1 ON #T(C1);
INSERT INTO #T(C1) VALUES(8)
INSERT INTO #T(C1) VALUES(6)
INSERT INTO #T(C1) VALUES(7)
INSERT INTO #T(C1) VALUES(5)
INSERT INTO #T(C1) VALUES(3)
INSERT INTO #T(C1) VALUES(0)
INSERT INTO #T(C1) VALUES(9)
DECLARE C CURSOR DYNAMIC
FOR SELECT K1,C1 FROM #T;
OPEN C
FETCH C
WHILE(@@FETCH_Status=0)
BEGIN
UPDATE #T SET C1=C1+1
WHERE CURRENT OF C;
FETCH C;
END
CLOSE C;
DEALLOCATE C;
DROP Table #T;
GO
分享到:
相关推荐
3. 执行查询,设置CommandBehavior为SequentialAccess以优化游标性能。 4. 获取OracleDataReader,这将返回一个只读、向前的游标。 5. 使用Read方法逐行读取数据,处理每行数据。 6. 完成后,关闭OracleDataReader和...
2. **优化游标查询**: - 使用索引而不是全表扫描来提高查询速度。 - 避免在WHERE子句中使用复杂的表达式,这可能使得Oracle无法使用索引。 - 对于经常使用的查询,考虑创建物化视图。 3. **使用FOR循环代替游标...
2. **Oracle教程**:Oracle是一种广泛应用的关系型数据库管理系统,游标.doc可能涵盖了如何在Oracle中使用游标进行数据处理,游标在复杂查询和循环处理中的作用,以及如何优化游标性能。了解Oracle数据库对于任何...
因此,在设计应用程序时,应尽可能优化游标的使用,避免无谓的资源消耗。 在"游标.txt"文件中,可能包含了更多关于Oracle游标的使用实例和技巧,包括游标的声明、动态游标、游标变量、游标表达式以及游标在存储过程...
- **游标的高效使用技巧**:本章将介绍如何正确地使用游标以避免性能瓶颈,包括何时使用游标、如何优化游标性能等最佳实践。 #### 知识点四:动态SQL - **动态SQL概述**:动态SQL是指在运行时构建和执行的SQL语句...
【TSQL 存储过程】 ...了解如何创建、修改和删除存储过程,以及如何利用游标和进行SQL优化,对于提升数据库系统的性能和效率至关重要。同时,存储过程分页则能帮助在大数据量下提供更好的用户体验。
#### 使用WHERE子句优化游标 在声明游标时,合理使用WHERE子句可以极大地提高查询效率和准确性。WHERE子句可以帮助过滤掉不相关的数据,减少数据处理量,从而提升整体性能。 #### 结论 游标是Oracle数据库中一项...
因此,应尽量优化游标使用,避免不必要的数据库调用。 “Oracle数据库游标使用大全.pdf”这份文档可能详细介绍了以上内容,并提供了具体的示例代码和实践技巧,帮助读者深入理解和应用Oracle数据库游标。通过学习和...
在SQL Server中,游标是一种重要的工具,它允许我们逐行处理查询结果集,而不仅仅是一次性获取所有数据。游标提供了在结果集中向前或...然而,为了优化性能,应当在必要时才使用游标,并确保在使用后正确地关闭和释放。
Oracle游标是数据库管理系统中的一种数据处理机制,它允许用户按需逐行处理查询结果,而不是一次性加载所有数据。...通过学习和实践,我们可以提升数据库操作的效率和灵活性,优化应用程序的性能。
总结来说,"进程达到最大游标数"是数据库管理中常见的问题,它涉及到程序设计、数据库配置和性能优化等多个方面。通过深入理解游标的工作原理,合理编写代码,以及有效利用数据库系统提供的工具和参数调整,可以有效...
Oracle数据库作为广泛应用的关系型数据库管理系统,其游标、存储过程和SQL优化是提升系统性能的关键技术。本文将深入探讨这些概念及其在实际工作中的应用。 首先,游标是数据库操作中一种处理数据集的方式,允许...
虽然游标提供了灵活性,但它们也可能影响性能,因为每次提取数据都需要数据库交互。因此,在能用集约式操作(如JOINs或GROUP BY)解决问题时,应尽量避免使用游标。 至于标签“源码”和“工具”,可能指的是游标在...
在Oracle数据库中,存储过程是预编译的SQL和PL/SQL代码集合,它们可以执行特定的任务并提高数据库性能。游标是处理单行或多行数据集的一种机制,允许...在实际应用中,还需要注意优化游标操作,避免不必要的性能开销。
在实际应用中,我们可能还需要考虑并发和性能优化,例如,如果多个线程同时访问,可能需要使用连接池来管理数据库连接,以提高效率并避免资源耗尽。 总结来说,`JdbcTemplate`配合游标滚动是一种有效的分页解决方案...
* 提高数据库的性能:存储过程可以预编译和优化,减少了数据库的负载。 * 提高安全性:存储过程可以限制用户的访问权限,提高数据库的安全性。 * 提高开发效率:存储过程可以重复使用,减少了开发时间和成本。 结论...
ORACLE SQL性能优化系列 ORACLE SQL性能优化是数据库管理员和开发者非常关心的一个话题。为了提高数据库的性能,ORACLE 提供了多种优化技术。下面我们将详细介绍 ORACLE SQL 性能优化系列中的一些重要知识点。 一...
尽管触发器和游标在某些情况下非常有用,但过度依赖它们可能导致性能问题,因为它们增加了数据库的处理负担。因此,在设计数据库方案时,应谨慎考虑是否真正需要使用触发器和游标,并尽量优化其使用。 总结一下,...
事务是数据库操作的基本单元...它们是数据库设计和优化的重要工具,能够帮助我们更高效、安全地管理和操作数据库中的数据。在实际开发中,根据具体业务需求灵活运用这些概念和技术,可以显著提升系统的性能和用户体验。