在这里,我不打算
介绍使用SQL Server技巧,不能提供治愈,我所做的是总结一些经验,如何形成一个良好的设计。这些经验来自我在过去几年学到的经验教训,我已经看到了许多相同的设计
错误反复一遍又一遍。
1。理解你使用的
工具 不要小看这个,这是最关键的一个我在本文中所描述的。也许你也看到很多SQL Server
程序员并不掌握所有的T-SQL
命令和SQL Server提供的有用的工具。
我已经浪费了一个月
学习SQL命令,我不会用,你可能会说,是的,你没有去做。但你要在周末
浏览所有T-SQL命令。在这里,你的
任务是理解,在未来,你设计一个
查询的时候,你会记住:是的,有一个命令,完全可以满足我需要的
功能,所以我可以去MSDN看到该命令的具体语法。
两。不要使用游标
让我重复一遍:不要使用光标。如果你想破坏整个
系统的
性能,它们是你最有效的选择。大多数初学者使用游标而不知道它们对性能的
影响。它们以不可想象的方式占用
内存和锁定表。此外,它们就像蜗牛,最糟糕的是,它们可以使DBA的所有性能
优化。我想知道,如果您知道每一个取数都等于选择命令的实现,这意味着如果游标有10000的记录,它将
执行10000次选择!如果使用一组选择、更新或
删除来完成这项
工作,它将更加有效。
初学者通常认为使用游标是一种熟悉而舒适的编程方式,但不幸的是,它会导致性能不佳。显然,SQL的总体
目标是您将要实现的目标,而不是如何实现它。
我用T-SQL重写存储过程基于游标,它只有100000的记录。最初的存储过程花费了40分钟来完成,新的存储过程花费了10秒,在这里,我认为您应该能够看到一个不称职的程序员正在做什么!!!
我们可以写一个小程序来
处理数据和数据库的更新,有时是更有效的。记住:没有什么可以做的周期问题。
让我再次提醒一下:使用游标是没有用的。除了DBA的工作,我还从未见过使用游标有效地完成工作。
三。规范化你的数据表
有关于为什么数据库是不规范的两条理由:为性能考虑,纯粹是由于懒惰。至于第二,你将不得不支付它迟早。以及性能的问题,你不需要优化的东西是不是在所有缓慢。我
经常看到一些程序员反规范化的数据库,他们的理由是,原来的设计太慢,但结果往往是他们使系统slower.dbms是设计来处理数据库的规范,所以记得要按规范要求设计数据库。
四。不要使用选择*
这是不容易做到的,我知道太多,因为我做了很多。但是,如果您指定您需要的列在选择,它将带来以下好处:
1减少内存消耗和
网络带宽
2你可以得到更安全的设计
3给查询优化器从索引中读取所有必需列的机会。
五。了解您将如何处理这些数据
创建你的数据库鲁棒性指标,这是一件功德。这样做是一种艺术。每次你添加一个索引表,选择会比较快,但插入和删除会慢很多,因为创造
维护索引需要很多额外的工作。显然,在这里是你想做的事与表的关键问题。这个问题不是很好,特别是当它涉及到删除和更新,因为这些语句通常包含在其中的部分选择命令。
六。不要为性列创建索引。
首先,我们必须了解指数加速表的访问。你可以了解指数的一种方式,将基于一定标准的表。如果你创建一个柱状性的一个指标,你只是将表格分为两部分:男人和女人。你面对的是一个表1000000记录,什么是分工的意义:维持指数time-consuming.when你设计的一个指标,遵循这一原则:根据不同内容的数量,列可能包含由多到少,如姓名+性别+省。
七。使用事务
请使用事务,特别是当查询更time-consuming.if系统中存在一个问题,它会拯救你的生命。在一般
情况下,一些有经验的程序员都有经验,你经常会遇到意想不到的情况,导致存储程序崩溃。
八。小心死锁
按一定
顺序访问表,如果先锁定表,然后锁定表B,然后按顺序将它们锁定在所有存储过程中,如果在存储过程中先锁定表B,然后锁定表A,则可能导致死锁,如果锁顺序没有预先设计好,死锁就不容易找到。
九。不要打开大型数据集
一个经常被问到的问题是:我如何添加记录100000组合快速,这是错的,你不能不去做。这是很简单的。你的
用户必须浏览100000条记录才能找到所需的记录,他会诅咒你。在这里,你需要的是一个更好的用户
界面,你需要为用户
显示不超过100或200条记录。
十。不要使用
服务器端游标。
与服务器端游标相比,客户端游标可以减少服务器和网络的系统开销,并减少锁定时间。
十一。使用
参数查询
有时,我看到在CSDN技术论坛这样一个问题:选择*从哪张= 'a'b,因为单引号查询是不正常的,我应该做什么一般的答案是使用两个单引号,而不是单引号。这是错误的。这样的临时
解决方案是无效的,因为在其他字符上也会遇到这样的问题。此外,这将导致严重的错误。否则,SQL Server的缓冲系统无法发挥应有的
作用,使用查询参数,根本解决不了这些问题,都不存在。
十二。在程序编码中使用大量数据的数据库。
程序员在开发中使用的测试数据库不是大量的数据,但最终用户往往拥有大量的数据。我们的常规做法是错误的,
原因很简单:现在
硬盘不是很昂贵,但是为什么性能问题要等到它是不可撤销的呢
十三。不要使用INSERT来导入大量数据。
请不要这样做,除非它是必要的。使用UTS或BCP可以让你一下子有灵活性和
速度。
十四。注意加班问题
查询数据库时,一般数据库的
默认值相对较小,比如15秒或30秒,有些查询
运行时间比这长,尤其是数据库中的数据量变大时。
十五。不要忽略同时更改同一记录的问题。
有时,两个用户在同一时间
修改同一个记录,以便后者修改前一个修饰符的
操作,一些更新将丢失。处理这种情况并不困难:创建一个时间戳字段,在写入之前
检查它,如果允许,合并和修改,如果有冲突,
提示用户。
十六。在
详细表中插入记录时,不要在主表上执行选择max(id)。
这是一个常见的错误,从而导致错误当用户插入的数据在同一时间。你可以使用scope_identity,ident_current,和身份。如果可能的话,不要用身份,因为在触发的情况下,它会导致一些问题(看到这里的讨论)。
十七。避免
设置的栏目为空
如果可能的话,你应该避免设置的栏目为空,系统分配的每一行的空列一个额外的字节,和查询将带来更多的系统开销。此外,设置栏目为空使编码复杂,因为每一次的列的访问,必须首先检查。
我不是说空是麻烦的根源,尽管有些人是这么认为的。我认为如果你允许空数据,业务规则,将被设置为可空有时会起到很好的作用,但是如果你在类似这种情况下使用空,简直是自找的。
customername1
customeraddress1
customeremail1
customername2
customeraddress2
customeremail3
customername1
customeraddress2
customeremail3
如果是这样的话,你需要标准化你的手表。
十八。尽量不要使用
文本数据
类型。
不使用它,除非你使用文字来处理大量的数据,因为它是不容易的查询,速度慢,不好用会浪费很多
空间。一般来说,VARCHAR可以处理你的数据更好。
十九。尽量不要使用临时表
尽量不要使用临时表,除非你必须这样做。子查询可以用来代替一个临时表。使用临时表可以带来的系统开销。如果你的程序与COM+,它会给你带来很多麻烦,因为COM+使用数据库
连接池和临时表中存在的所有time.sql Server提供了一些替代品,如表数据类型。
二十。学会分析和查询
SQLServer查询分析器是您的好合作伙伴,通过它您可以了解查询和索引是如何影响性能的。
二十一。
参考完整性的使用
定义主要的健康、唯一性约束和外键,这样可以节省很多时间。