使用 SQL-92 标准连接句法。 
 
• 为了提高性能,应优先使用连接,然后使用子查询或嵌套查询。 
 
• 确保变量和参数的类型和大小与表数据列相匹配。 
 
• 确保使用所有变量和参数,或者全部删除。 
 
• 尽可能将临时对象放置在本地。 
 
• 只使用在存储过程中创建的临时表。 
 
• 检查输入参数的有效性。 
 
• 优先使用 SELECT...INTO,然后使用 INSERT...SELECT,以避免大量死锁。 
 
• 维护工作需要的逻辑单元;在可以缩短的情况下,不要创建大量或长时间运行的进程。 
 
• 不要在任何代码中使用 SELECT *。 
 
• 在过程中使用缩进、块、制表符和空格(参阅示例脚本)。 
 
• T-SQL 语句要大写。 
 
• 在过程中添加大量注释,确保可以识别进程。在有助于澄清处理步骤的地方使用行注释。 
 
• 包括事务管理,除非要从 MTS 进程中调用过程。(为 MTS 进程编写独立的过程。) 
 
• 监视 @@TRANCOUNT 以确定事务的责任级别。 
 
• 避免使用 GOTO,错误处理程序中除外。 
 
• 避免使用嵌套过程。 
 
• 避免隐式解析对象名称,确保所有对象都归 dbo 所有。 
 

解决方案 »

  1.   

    简单的说:
    SELECT 加上 FROM TABLE WITH(NOLOCK)
    UPDATE多表时,注意顺序一致。
      

  2.   

    1 如何锁一个表的某一行
    /*
            测试环境:windows 2K server + Mssql 2000
            所有功能都进行测试过,并有相应的结果集,如果有什么疑义在论坛跟帖
            关于版权的说明:部分资料来自互联网,如有不当请联系版主,版主会在第一时间处理。
            功能:sql遍历文件夹下的文本文件名,当然你修改部分代码后可以完成各种文件的列表。
    */
    A 连接中执行SET TRANSACTION ISOLATION LEVEL REPEATABLE READbegin transelect * from tablename with (rowlock) where id=3waitfor delay '00:00:05'commit tranB连接中如果执行update tablename set colname='10' where id=3 --则要等待5秒update tablename set colname='10' where id<>3 --可立即执行2 锁定数据库的一个表SELECT * FROM table WITH (HOLDLOCK) 
    注意: 锁定数据库的一个表的区别SELECT * FROM table WITH (HOLDLOCK) 
    其他事务可以读取表,但不能更新删除SELECT * FROM table WITH (TABLOCKX) 
    其他事务不能读取表,更新和删除
      

  3.   

    提高SELECT与UPDATE操作的执行速度,这是个思路
      

  4.   

    死锁大多是人为的,解决的办法简单来讲就是select时不加锁、写操作时,顺序一致。
      

  5.   

    如果是sql server可以偵測到的死鎖,sql會自動停掉某個deadlock_priority較低的程序,所以只要前端應用程式做好錯誤處理,就可以將傷害降到最低。
    但是有些死鎖是sql server偵測不到的,比如一些分散式交易。
    這個時候,能不能找到錯誤,就看經驗和運氣了......
      

  6.   

    不能一根而论,一般来讲聚集索引索引要高,因为非聚集索引要靠主键来获取非聚集索引所不含有的其它字段。
    但当你所select的字段本身就位于非聚集索引中,那么它的效率基本等同于聚集索引
      

  7.   

    select * from tb with(updlock)
    update tb
    set ..
    where 
    go按照此顺序执行,并加锁提示
      

  8.   

    14楼,如果在更新之前加更新锁,此时如果其他用户对该表进行SELECT,是否会被锁住?
      

  9.   

    如果事前不加更新锁,在执行UPDATE 时,系统不是会自动加排它锁吗?与事先手工加更新锁有什么区别?