上一页 1 ··· 16 17 18 19 20 21 22 23 24 ··· 41 下一页

2014年1月17日

疑难杂症--单回话下 WITH(NOLOCK)返回更多数据

摘要: ​场景:某DBA在一个人操作数据库时发现,可提交读事务隔离级别下返回的数据少于未提交读事务隔离级别,确认没有其他事务修改数据。解决方案1:将数据查询放入一个新建的表,使用该表查询发现问题被消除。解决方案2:运行DBCC CHECKDB,发现 3 个分配错误和 21756 个一致性错误,使用DBCC CHECKDB(REPAIR_REBUILD)来修复问题原因:在未提交读或NOLOCK下,SQL SERVER 使用IAM链来读取所有数据,在普通模式下,SQL SERVER 按照聚集索引的索引链(每个索引页头存放上一页和下一页的文件ID和页ID)来访问所有数据,因此当分配页出现错误时,就会导致该情 阅读全文

posted @ 2014-01-17 15:39 笑东风 阅读(350) 评论(0) 推荐(0) 编辑

疑难杂症--已停止运行DBCC造成阻塞

摘要: 场景数据库因非法断电导致出现分配页上不一致,运行完DBCC CHECKDB后出现以下错误:表错误: 表 't_pc_id' (ID 277576027)。数据行在索引 'last_login_date' (ID 7)中没有匹配的索引行。与以下数据行匹配的索引行的键可能丢失或关闭运行DBCC CHECKDB所在的SSSM时出现错误重新打开SSMS ,查看索引last_login_date使用情况发现该索引没有被任何查询使用到,于是准备先禁用索引再后续删除在一登陆界面上使用SSMS UI来禁用索引,结果发现UI无法操作(当时CPU使用率较高)切换到另一登陆界面,在S 阅读全文

posted @ 2014-01-17 15:27 笑东风 阅读(684) 评论(0) 推荐(0) 编辑

疑难杂症--数据库触发器导致批处理中变量无效

摘要: 场景:在数据库上有触发器(该触发器由复制发布产生)create trigger [tr_MStran_altertable] on database for ALTER_TABLE as set ANSI_NULLS ON set ANSI_PADDING ON set ANSI_WARNINGS ON set ARITHABORT ON set CONCAT_NULL_YIELDS_NULL ON set NUMERIC_ROUNDABORT OFF set QUOTED_IDENTIFIER ON declare @EventData xml set @EventData=EventDat 阅读全文

posted @ 2014-01-17 15:26 笑东风 阅读(543) 评论(0) 推荐(0) 编辑

Transaction And Lock--锁相关基础

摘要: --=======================================================--锁提示--holdlock :将共享锁保留到事务完成,而不是在相应的表、行或数据页不需要时就立即释放锁。holdlock等同于serializable--pagelock :在通常使用单个表锁的地方采用页锁--nolock :不要发出共享锁,并且不要提供排他锁。当此选项生效时,可能会读取未提交的事务或一组在读取中间回滚的页面。--有可能发生脏读。仅应用于select语句;NOLOCK在查询数据时不会被U锁阻塞,但是会被SCH-M锁阻塞;NOLOCK在任何事务隔离级别下效果都一样 阅读全文

posted @ 2014-01-17 15:23 笑东风 阅读(857) 评论(0) 推荐(0) 编辑

INDEX--关于索引的琐碎

摘要: --=========================================================更新时的操作1>更新时有两种方式,一种是在原来的位置更新,另外一种是移除删除再插入。2>无论采用何种方式更新数据,在触发器中都能使用DELETED和INSERTED表来获取更新前和更新后数据。--=========================================================--8亿数据创建非聚集索引时间数据表中数据:873476300建立索引耗时:41分39秒 索引键:BIGINT+DATETIME+INT服务器配置:8核32G内 阅读全文

posted @ 2014-01-17 15:09 笑东风 阅读(272) 评论(0) 推荐(0) 编辑

INDEX--索引相关信息查看

摘要: --==============================================--查看可能缺失的索引SELECT mig.*,migs.*,mid.* FROM sys.dm_db_missing_index_group_stats AS migs INNER JOIN sys.d... 阅读全文

posted @ 2014-01-17 14:55 笑东风 阅读(608) 评论(0) 推荐(0) 编辑

INDEX--索引页上存放那些数据

摘要: 由于索引的叶子节点和非叶子节点的作用不同,导致不同类型节点上每行记录存放的数据不同--============================================唯一聚集索引叶子节点:所有有列非叶子节点:索引键+文件ID+页ID--============================================非唯一聚集索引叶子节点:所有有列非叶子节点:索引键+UNIQUFUER列+文件ID+页ID--============================================在聚集表上的唯一非聚集索引叶子节点:非聚集索引+文件ID+页ID非叶子节点:非聚集索引 阅读全文

posted @ 2014-01-17 14:53 笑东风 阅读(879) 评论(0) 推荐(0) 编辑

2014年1月16日

Transaction And Lock--解决死锁/锁的几种有效方式

摘要: 修改资源访问顺序,使多个事务对资源的访问方式一致 优化查询SELECT,使得S锁能尽早释放 均可能将更新和删除语句放到事务末端(使得X锁占用时间最小) 避免事务执行期间暂停或等待外部输入 将较大事务拆分成多个小事务提交 控制事务在合适的隔离级别上运行 建立合适索引提示语句效率 删除无用索引和统计 将数据更新修改为数据插入 将数据拆按状态分到多个表 考虑使用快照解决S锁阻塞X锁 考虑使用程序队列来限制并发数(高并发造成大量的锁等待和上下文切换以及CPU资源消耗) 使用复制等技术将读写分离 在程序段使用缓存来避免对相同数据频繁更新 阅读全文

posted @ 2014-01-16 18:23 笑东风 阅读(603) 评论(0) 推荐(0) 编辑

Transaction And Lock--由Lookup导致的死锁情况

摘要: 存在这样情况: 1.表TB1有一列建立索引 2.事务A对表进行更新,先获取对表的X锁以更新基本表中数据,然后对索引申请X锁以更新索引数据。 3.事务B对表进行更新,先获取索引上S锁以使用索引进行Loopup来查询数据,然后申请表的X锁以更新基本表数据 由于事务A和事务B申请到一部分锁资源同时需要对方的锁资源来完成操作,由于锁的不可剥夺性导致死锁产生 解决此类死锁的有效办法: 1.减少每次修改数据的行数,以减少事务的执行时间,从而降低事务发生的可能性 2.在一些情况下使用Include索引来减少lookup操作 阅读全文

posted @ 2014-01-16 18:22 笑东风 阅读(425) 评论(0) 推荐(0) 编辑

Transaction And Lock--由外键导致的死锁

摘要: 死锁发生情况:1. 存在表A和表B,表A的主键是表B的外键2.事务A在表A上申请到X锁以修改表A中数据和删除表A中的数据,然后需要检查表B中的数据是否满足外键约束,从而需要Range锁来锁住表B3.事务B在表B上申请到X锁以修改表B中数据,然后向表A申请S锁来查询数据以上情况表造成资源环状阻塞,从而应发死锁。解决办法:1. 从设计角度来看,应避免修改表A中主键的值2. 对表B上的外键列建立索引,从而使事务A发生时将range锁放到索引上,从而降低死锁发生的概率​ 阅读全文

posted @ 2014-01-16 18:20 笑东风 阅读(902) 评论(0) 推荐(0) 编辑

上一页 1 ··· 16 17 18 19 20 21 22 23 24 ··· 41 下一页

导航