T-SQL Part V: Locks

本文介绍了SQL Server中的锁机制,包括可以进行锁定的资源如ROW、PAGE等,以及锁的类型如Shared、Update、Exclusive等,并提供了锁排查的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写SQL最常见的问题就是Dead Lock了。本篇简单介绍入门级别的Lock使用和排查。

首先来看MSDN上的官方文档(https://technet.microsoft.com/en-us/library/jj856598(v=sql.110).aspx)。

摘要一下,SQL Server可以进行Lock的Resource:

ResourceDescription
RIDA row identifier used to lock a single row within a heap.
KEYA row lock within an index used to protect key ranges in serializable transactions.
PAGEAn 8-kilobyte (KB) page in a database, such as data or index pages.
EXTENTA contiguous group of eight pages, such as data or index pages.
HoBTA heap or B-tree. A lock protecting a B-tree (index) or the heap data pages in a table that does not have a clustered index.
TABLEThe entire table, including all data and indexes.
FILEA database file.
APPLICATIONAn application-specified resource.
METADATAMetadata locks.
ALLOCATION_UNITAn allocation unit.
DATABASEThe entire database.

Lock的类型:

Lock modeDescription
Shared (S)Used for read operations that do not change or update data, such as a SELECT statement.
Update (U)Used on resources that can be updated. Prevents a common form of deadlock that occurs when multiple sessions are reading, locking, and potentially updating resources later.
Exclusive (X)Used for data-modification operations, such as INSERT, UPDATE, or DELETE. Ensures that multiple updates cannot be made to the same resource at the same time.
IntentUsed to establish a lock hierarchy. The types of intent locks are: intent shared (IS), intent exclusive (IX), and shared with intent exclusive (SIX).
SchemaUsed when an operation dependent on the schema of a table is executing. The types of schema locks are: schema modification (Sch-M) and schema stability (Sch-S).
Bulk Update (BU)Used when bulk copying data into a table and the TABLOCK hint is specified.
Key-rangeProtects the range of rows read by a query when using the serializable transaction isolation level. Ensures that other transactions cannot insert rows that would qualify for the queries of the serializable transaction if the queries were run again.

T-SQL中,使用Lock最简单的方法当然是SELECT ... FOR UPDATE,选中对应的ROW进行Lock以便Update。


进行Lock排查,可以通过以下方式进行查看当前Lock的状态:

  • exec sp_lock; 这是最原始的方式,dump所有Lock相关的信息。
  • select cmd,* from sys.sysprocesseswhere blocked > 0通过查看当前sysprocesses的方式来抉择那些process被blocked。配合上exec sp_who2和kill,分别用来查看process的信息和终止指定的process。
  • select * from sys.dm_tran_locks; Dynamic View dm_trans_locks返回当前系统中的locks。Dynamic Views and Functions请参阅:https://msdn.microsoft.com/en-us/library/ms188754.aspx
是为之记。
Alva Chien
2016.5.30
<think>好的,我需要回答用户关于Oracle SQL查询性能优化的最佳实践。首先,我得回忆一下相关的知识,并结合提供的引用内容。用户提到了四个引用,涉及并行处理、SQL优化目标、索引优化和锁信息查询。这些应该都是优化的重要方面。 首先,优化SQL查询通常包括多个方面,比如索引的使用、查询语句的编写、执行计划的分析、并行处理等。用户提供的引用里提到了并行处理可以提升性能,所以这点需要强调。引用[1]提到并行执行查询和DML操作能提高速度,这可能涉及到使用PARALLEL提示或者设置并行度。 然后,引用[2]指出SQL优化的目标是减少执行时间,具体方法有减少不必要的数据读取、利用索引和优化查询逻辑。所以需要提到避免SELECT *,使用WHERE子句过滤数据,以及优化连接操作等。 引用[3]是关于索引优化的,创建合适的索引是关键。比如在经常查询的字段上添加索引,如order_date字段。同时,可能还要提到避免过多的索引,因为会影响写操作的性能。 引用[4]是查询锁信息的示例,这可能和性能调优中的锁竞争有关。需要提到监控锁的情况,避免长时间持有锁导致阻塞。 接下来,我需要将这些点组织成结构清晰的建议。可能需要分点列出,每个点详细说明,并给出示例。例如,索引优化部分可以给出创建索引的SQL示例,并行处理部分可以给出使用PARALLEL提示的例子。 同时,用户要求生成相关问题,我需要考虑常见的后续问题,比如执行计划分析、统计信息更新、分区表的使用、绑定变量的优势等。这些问题应该与主回答内容相关,帮助用户深入理解优化方法。 需要确保使用正确的中文表达,避免术语错误。还要检查LaTeX格式是否正确,数学表达式或代码用$或$$包裹。例如,在解释索引选择性时,可能需要用数学表达式,比如高选择性的索引条件如$column = value$,而低选择性的如$status = 'active'$。 另外,要确保每个引用在回答中正确标注,比如在提到并行处理时加上[^1],索引优化时引用[^3],锁信息时引用[^4],而SQL优化目标引用[^2]。 最后,检查回答是否覆盖了主要优化方面,结构是否清晰,是否有代码示例和实际建议,以及相关问题是否合理。确保没有遗漏用户关心的点,比如执行计划分析工具的使用,或者具体如何避免全表扫描。</think>### Oracle SQL查询性能优化最佳实践 #### 1. **索引优化** - **创建合适索引**:在频繁查询的字段(如$order\_date$)或连接条件字段上创建索引,可显著减少数据扫描量。 ```sql CREATE INDEX idx_order_date ON orders (order_date); -- 示例 ``` - **索引选择性**:优先为高选择性字段(如唯一值比例高的列)建立索引。例如,对$customer\_id$的查询比对$status$(可能仅有几个枚举值)更高效。 - **避免过多索引**:索引会降低写操作性能,需权衡读写比例。 #### 2. **SQL语句优化** - **减少数据读取**:避免使用`SELECT *`,明确指定所需字段[^2]。 - **优化WHERE子句**: - 使用索引列作为过滤条件,例如$amount > 1000$。 - 避免在索引列上使用函数(如`TO_CHAR(order_date)`),否则索引失效。 - **连接操作优化**: - 使用`INNER JOIN`替代`WHERE`隐式连接,提升可读性和执行效率。 - 对小表优先执行过滤,再与大表关联。 #### 3. **执行计划分析** - 使用`EXPLAIN PLAN`或`SQL*Plus`的`AUTOTRACE`工具分析查询路径。 ```sql EXPLAIN PLAN FOR SELECT * FROM orders WHERE order_date = SYSDATE; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); -- 查看执行计划 ``` - 关注`FULL TABLE SCAN`(全表扫描)和`INDEX RANGE SCAN`(索引范围扫描),优先通过索引减少扫描范围。 #### 4. **并行处理加速** - 对大表查询或复杂计算,启用并行执行: ```sql SELECT /*+ PARALLEL(orders, 4) */ * FROM orders WHERE amount > 10000; -- 指定并行度为4 ``` - 需确保系统资源充足,避免过度并行导致资源竞争。 #### 5. **统计信息更新** - 定期更新表和索引的统计信息,优化器才能生成高效计划: ```sql EXEC DBMS_STATS.GATHER_TABLE_STATS('SCHEMA_NAME', 'ORDERS'); -- 手动收集统计信息 ``` #### 6. **避免锁竞争** - 监控锁状态,及时处理阻塞会话: ```sql SELECT * FROM sys.dm_tran_locks WHERE request_status = 'WAIT'; -- 查询锁等待 ``` - 优化事务设计,减少事务持有时间。 #### 7. **分区表技术** - 对海量数据按时间或范围分区,缩小查询范围: ```sql CREATE TABLE orders_part PARTITION BY RANGE (order_date) ( PARTITION p2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD')) ); ``` #### 8. **绑定变量优化** - 使用绑定变量避免硬解析,减少CPU消耗: ```sql -- PL/SQL示例 DECLARE v_id NUMBER := 100; BEGIN EXECUTE IMMEDIATE 'SELECT * FROM orders WHERE order_id = :1' USING v_id; END; ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值