1

我有桌子说

选项卡1

ID, TARGET, STATE, NEXT

ID是主键。

显示死锁的查询与此类似

SELECT * 
FROM TAB1 
WHERE NEXT = (SELECT MIN(NEXT) FROM TAB1 WHERE TARGET=? AND STATE=?) FOR UPDATE

我做了一个解释计划,我看到这样的东西:

| Id  | Operation             | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |               |     1 |  8095 |     6   (0)| 00:00:01 |
|   1 |  FOR UPDATE           |               |       |       |            |          |
|   2 |   BUFFER SORT         |               |       |       |            |          |
|*  3 |    TABLE ACCESS FULL  | TAB1          |     1 |  8095 |     3   (0)| 00:00:01 |
|   4 |     SORT AGGREGATE    |               |     1 |  2083 |            |          |
|*  5 |      TABLE ACCESS FULL| TAB1          |     1 |  2083 |     3   (0)| 00:00:01 |

由于查询执行 TABLE ACCESS FULL 两次,所以我怀疑执行相同查询的 2 个会话将以不同的顺序访问行。

列索引是否有助于防止死锁?说在 NEXT 上创建索引???或者通过将主键更改为非集群键?注意:通常,该表最多有 1000 行。

4

1 回答 1

-2

在 NEXT 列上添加非聚集索引确实会提高您的性能并减少死锁问题。

于 2013-10-17T21:05:41.280 回答