当前位置:首页 » 编程语言 » sql查询阻塞
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql查询阻塞

发布时间: 2022-11-28 14:06:53

① 常见的sql Server阻塞情形有哪些

这一类阻塞的特征,就是问题连接早就进入了空闲状态(sysprocesses.status='sleeping'和sysprocesses.cms='awaiting command'),但是,如果检查 sysprocesses.open_tran,就会发现它不为0,以及事务没有提交。这类问题很多都是因为应用端遇到了一个执行超时,或者其他原因,当时执行的语句倍提前终止了,但是连接还保留着。应用没有跟随发来的事务提交或回滚指令,导致一个事务被遗留在 Sql Server 里。

解决办法:

应用程序本身必须意识到任何语句都有可能遇到意外终止的情况,做好错误处理工作。这些工作包括:

· 在做 Sql Server 调用的时候,须加上错误捕捉和处理语句:If @@Trancount>0 RollBack Tran;(在程序中设置If @@Error<>0 Rollback Tran; 并不总是能执行到该语句)

② GBase8a集群的SQL任务阻塞

默认情况下, Linux会最多使用40%的可用内存作为文件系统缓存。当超过这个阈值后,文件系统会把将缓存中的内存全部写入磁盘, 导致后续的IO请求都是同步的。
将缓存写入磁盘时,有一个默认120秒的超时时间。 出现上面的问题的原因是IO子系统的处理速度不够快,不能在120秒将缓存中的数据全部写入磁盘。
IO系统响应缓慢,导致越来越多的请求堆积,最终系统内存全部被占用,导致系统失去响应。
建议根据应用程序情况,对vm.dirty_ratio,vm.dirty_background_ratio两个参数进行调优设置。 例如,推荐如下设置:
# sysctl -w vm.dirty_ratio=10
# sysctl -w vm.dirty_background_ratio=5
# sysctl -p
如果系统永久生效,修改/etc/sysctl.conf文件。加入如下两行:
#vi /etc/sysctl.conf
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
重启系统生效。

③ SQL进程堵塞了,怎么处理

SQL
Server
的内存管理机制是:
有可用内存,
则为新需求分配内存
无可用内存时,
释放内存来处理新需求.
这是SQL
Server
缓冲池的预期行为。
默认情况下,在启动
SQL
Server之后,SQL
Server会根据操作系统报告的物理内存数来动态增大或缩小高速缓冲存储器的容量。
只要可用物理内存大小保持在4MB到10MB之间,SQL
Server
缓冲池就会继续增大(保留可用物理内存在4MB到10MB之间是为了
避免操作系统因为缺少内存而频繁地换页)。如果物理可用内存变得较少的时候,则SQL
Server会将一些内存释放给操作系统。
解决方案:
1.给操作系统、sql
server打最新补丁
2.确保不是病毒原因(可能性比较小)
3.sql
server设计时的要求就是最大可能的减少磁盘的I/O,磁盘I/O是比较消耗资源的,这个磁盘I/O包括了读取数据库文件
还有和虚拟内存的页交换。如果还有足够的可用内存它都会毫不吝啬的使用的(没有设置上限),它会根据需要动态获取和
释放内存的。你要分析的是这占用的内存开销主要用做了什么?是不是有大型的查询或事务操作。
4.如果服务器是专职的数据库服务器,不建议设置最大内存上限。如果还有其它重要的服务在机器上运行,就要考虑它的内存
使用是否会影响其它服务的正常的运行和性能。如果你的服务器除了sql服务,
还有其他服务需求,
则需要设置sql
server的最大内存限制

④ oracle sql阻塞怎么解决

使用v$locked_object视图查看阻塞会话的session id,然后通过v$session+v$sql视图查看一下正在执行什么操作。如果可以,使用alter session命令kill掉即可解决阻塞。

⑤ 如何查看oracle 中某条sql阻塞了某个sql

死锁的定位方法
通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台。
1)用dba用户执行以下语句

selectusername,lockwait,status,machine,programfromv$sessionwheresidin
(selectsession_idfromv$locked_object)

如果有输出的结果,则说明有死锁,且能看到死锁的机器是哪一台。字段说明:
Username:死锁语句所用的数据库用户;
Lockwait:死锁的状态,如果有内容表示被死锁。
Status: 状态,active表示被死锁
Machine: 死锁语句所在的机器。
Program: 产生死锁的语句主要来自哪个应用程序。
2)用dba用户执行以下语句,可以查看到被死锁的语句。

selectsql_textfromv$sqlwherehash_valuein
(selectsql_hash_valuefromv$sessionwheresidin
(selectsession_idfromv$locked_object))

⑥ 如何查找产生阻塞的SQL

查看被锁的表

1
2
3

select p.spid,a.serial#,c.object_name,b.session_id,b.oracle_username,b.os_user_name
from v$process p,v$session a, v$locked_object b,all_objects c
where p.addr=a.paddr and a.process=b.process and c.object_id=b.object_id ;

查看那个用户那个进程造成死锁,锁的级别

1

select b.owner,b.object_name,l.session_id,l.locked_mode fromv$locked_object l, dba_objects

4、查看连接的进程

1

SELECT sid, serial#, username, osuser FROMv$session;

5、查看是哪个session引起的

1
2
3

select b.username,b.sid,b.serial#,logon_time
from v$locked_object a,v$session b
where a.session_id = b.sid order by b.logon_time;

6、杀掉进程

1

alter system kill session 'sid,serial#';

⑦ 如何解决 SQL Server 中的锁升级所致的阻塞问题

防止锁升级的最简单和最安全方法是使短的事务,以便不超过锁升级阈值,会减少昂贵查询的锁定占地面积。有多种方法可以获得这一目标,其中许多将列出:
拆分成几个较小的操作大的批处理操作。例如,假设您运行下面的查询从审核表中,删除几个几十万旧记录并随后发现它导致阻塞其他用户的锁升级:
DELETE FROM LogMessages WHERE LogDate < '2/1/2002'

通过一次删除这些记录几百,可以极大地减少积累每个交易记录,并防止锁升级的锁数。例如:
SET ROWCOUNT 500
delete_more:
DELETE FROM LogMessages WHERE LogDate < '2/1/2002'
IF @@ROWCOUNT > 0 GOTO delete_more
SET ROWCOUNT 0

使查询尽可能高效,从而减少查询的锁的占地面积。大范围的搜索或大量的书签查找可能会增加锁升级 ; 的机会此外,它增加了死锁的可能性,并通常会影响并发性和性能。查找查询后,会导致锁升级,力图寻找销售机会,以创建新的索引,或者若要将列添加到现有索引删除索引和表扫描和索引的效率的最大化。请考虑将查询粘贴到查询分析器的查询窗口以在其上执行自动索引分析。为此,请在查询菜单上,单击在 SQL Server 2000 中,索引优化向导,或单击执行索引分析SQL Server 7.0 中。

这种优化的目标之一是使索引搜索返回尽可能少的行,以书签查找 (最大化的选择性的特定查询的索引) 的成本降到最低。如果 SQL Server 估计书签查找逻辑运算符可能会返回多个行,它可能使用的预取来书签查找。如果 SQL Server 不会使用书签查找预取,必须增加对该查询的一部分可重复的读取查询的一部分的事务隔离级别。这意味着什么可能看起来类似于在读取已提交的隔离级别的 SELECT 语句可能会获取数以千计的键锁 (聚集的索引和上一个非聚集的索引),这可能会导致此类查询超过锁升级阈值。这一点尤其重要,如果您发现已呈报的锁不共享的表锁,其中,但是,通常看不到在默认读取已提交的隔离级别。如果使用预取的书签查找子句导致升级,请考虑将其他列添加到索引查找或下方的书签查找逻辑运算符扫描索引的逻辑运算符出现在查询计划中的非聚集索引。可能会创建覆盖索引 (包括在查询中使用表中的所有列的索引),或至少一个覆盖已选择的列的列表中包括的所有内容如果使用联接条件或 WHERE 子句中的列的索引是不切实际的。

嵌套循环联接也可以使用预取,,这将导致相同的锁定行为。

如果不同的 SPID 当前持有的不兼容表锁,则不会发生锁升级。始终锁升级升级到表级锁,而从不页锁。此外,如果锁定升级尝试失败,因为另一个 SPID 持有的不兼容的选项卡锁,尝试升级该查询不会阻止在等待选项卡锁。相反,它将继续获取锁定在其原始、 更精细的级别 (行、 键或页),定期进行其他升级尝试。因此,防止在某个特定的表上的锁升级的一种方法是获取并与升级的锁类型不兼容的不同连接保持锁定。IX (意向排它) 锁在表级别不会锁定任何行或页,但它仍不兼容已呈报 s (共享的) 或 X (独占) 选项卡上的锁。例如,假设您必须运行的批处理作业修改大量mytable表中的行和已导致阻塞的出现是由于锁升级。如果此作业始终在不到一小时内完成,可能会创建包含以下代码中,事务处理性 SQL 作业和计划新作业启动批处理作业的开始时间前几分钟的时间:
BEGIN TRAN
SELECT * FROM mytable (UPDLOCK, HOLDLOCK) WHERE 1=0
WAITFOR DELAY '1:00:00'
COMMIT TRAN

此查询获取,并一小时,这可以防止在表上的锁升级这段时间内保持在mytable的 IX 锁。这批不会修改任何数据或阻止其他查询 (除非其他查询强制使用 TABLOCK 提示的表锁,或如果管理员已经禁用页或行锁,通过使用sp_indexoption存储过程)。
此外,您可以通过启用跟踪标志 1211年禁用锁升级。但是,此跟踪标记会禁用所有的锁升级的 SQL Server 实例中的全局范围内。锁升级最大化 ; 否则减速的获取和释放锁的数千开销的查询的效率在 SQL Server 中提供非常有用的目的。锁升级还有助于最小化所需的内存,以跟踪的锁。可以将 SQL Server 锁结构中动态分配的内存是有限的的因此如果您禁用锁升级和锁定内存增长足够大、 分配额外的锁包含任何查询可能会失败并出现下面的错误:

错误: 1204,严重性: 19 日状态: 1
这一次,SQL Server 无法获得锁资源。有较少的活动用户时重新运行该语句,或者请求系统管理员检查 SQL Server 锁和内存配置。
注意"1204"错误时,它会停止当前语句的处理,并导致回滚当前事务。回滚本身可能会阻止用户或导致很长的数据库恢复时间,如果您在重新启动 SQL Server 服务。

使用锁定提示 (如 ROWLOCK 只会更改初始锁定计划。锁提示不能防止锁升级。

防止锁升级的前面部分讨论的其他方法是更好的方法比启用跟踪标记。此外,其他方法通常会导致查询性能优于禁用整个实例的锁升级。Microsoft 建议您启用此跟踪标记只是为了缓解严重阻塞引起锁升级,而其他选项,如那些讨论先前在本文中,所调查的。要启用跟踪标志,以便它打开时 SQL Server 启动时,将其添加为服务器启动参数。

添加服务器启动参数,用鼠标右键单击该服务器在 SQL 企业管理器中,单击属性然后单击在常规选项卡上的启动参数,然后添加下面的参数 (严格按照所示):
-T1211
您必须重新打开 SQL Server 服务为新的启动参数才会生效。如果您在查询分析器中运行下面的查询跟踪标记将立即生效:DBCC TRACEON (1211, -1)
但是,如果您没有添加-T1211启动参数traceon命令的效果时会丢失关闭并重新打开 SQL Server 服务。打开跟踪标志可防止任何将来的锁升级,但它不会反转任何已经发生的活动事务的锁升级。

⑧ 关于SQL Server 进程阻塞的问题

我估计你是不是要在第一个语句中,加上完成事务的语句啊。在UPDATE语句之后用Commint
TRAN。

⑨ sql server 2008死锁与阻塞怎样解决

MSDN:包含正在 SQL Server 实例上运行的进程的相关信息。这些进程可以是客户端进程或系统进程。 视图中主要的字段: 1. Spid:Sql Servr 会话ID 2. Kpid:Windows 线程ID 3. Blocked:正在阻塞求情的会话 ID。如果此列为 Null,则标识请求未被阻塞 4. Waittype:当前连接的等待资源编号,标示是否等待资源,0 或 Null表示不需要等待任何资源 5. Waittime:当前等待时间,单位为毫秒,0 表示没有等待 6. DBID:当前正由进程使用的数据库ID 7. UID:执行命令的用户ID 8. Login_time:客户端进程登录到服务器的时间。 9. Last_batch:上次执行存储过程或Execute语句的时间。对于系统进程,将存储Sql Server 的启动时间 10.Open_tran:进程的打开事务个数。如果有嵌套事务,就会大于1 11.Status:进程ID 状态,dormant = 正在重置回话 ; running = 回话正在运行一个或多个批处理 ; background = 回话正在运行一个后台任务 ; rollback = 会话正在处理事务回滚 ; pending = 回话正在等待工作现成变为可用 ; runnable = 会话中的任务在等待获取 Scheler 来运行的可执行队列中 ; spinloop = 会话中的任务正在等待自旋锁变为可用 ; suspended = 会话正在等待事件完成 12.Hostname:建立链接的客户端工作站的名称 13.Program_name:应用程序的名称,就是 连接字符串中配的 Application Name 14.Hostprocess:建立连接的应用程序在客户端工作站里的进程ID号 15.Cmd:当前正在执行的命令 16.Loginame:登录名 应用实例: 1. 检查数据库是否发生阻塞 先查找哪个链接的 blocked 字段不为0。如 SPID53的blocked 字段不为0,而是 52。SPID 52 的 blocked 为0,就可以得出结论:此时有阻塞发生,53 被 52 阻塞住了。如果你发现一个连接的 blocked 字段的值等于它自己,那说明这个连接正在做磁盘读写,它要等自己的 I/O 做完。 2. 查找链接在那个数据库上 检查 dbid 即可。得到 dbid,可以运行以下查询得到数据库的名字: Select name,dbid from master.sys.sysdatabases

⑩ SQL Server怎样查询某一阻塞或X锁持续的时间

select wt.session_id, --某个会话
wait_ration_ms / 1000 as 'wait seconds', --等待秒数
wait_type, --等待类型,可能是进程间的阻塞,也有可能是等待IO完成

blocking_session_id, --被这个会话阻塞的,如果有的话

tl.request_mode, --请求模式,比如S、IX、X
tl.request_type, --请求类型,比如Lock
tl.request_status --是否grant

from sys.dm_os_waiting_tasks wt
left join sys.dm_tran_locks tl
on wt.session_id = tl.request_session_id