数据库集群: 将多个服务器组成一组集群,将客户端负载分发到不同服务器上,随着应用程序负载的增加,只需要将新的服务器添加到集群即可。
集群的存在意义是为了保证高可用、数据安全、扩展性以及负载均衡。
数据库集群的两种形式:
Share-Disk架构是通过多个服务器节点共享一个存储来实现数据库集群。
Share-Nothing
查询性能调优涉及到的技术非常广泛,但是我们一般可以把它大致分为以下几个层次:
1.减少数据访问。相关的技术就是建立合适的索引,将全表扫描、索引扫描(scan)等耗时的操作转化为索引查找(seek)。建立正确的索引,能让数据库查询性能提升100-1000倍甚至更高,就好比一本非常厚的词典,如果没有任何索引,你要查一个东西,那可是相当费尽,需要整本书查一遍,有索引就可以直接根据索引定位了。这是最重要的改善性能的途径。
2.减少返回的数据。在网络中传输数据,带宽是有限的,如果能按需提取最少量的数据,会起到不错的作用。这里需要注意的是,在SQL中,不要出现select *,而是需要什么字段,就提取什么字段。
3.减少与数据库交互次数。网络资源有限,显然,频繁与数据库交互,也是制约性能的一个因素。一个良好的建议就是,使用存储过程,或者批处理语句,这样能减少与数据库的交互,提升一部分性能。
4.减少CPU的负荷。这里,主要是使用缓存计划。在查询中,尽量使用参数化的查询。这样的话,数据库会对查询参数进行缓存,从而复用查询计划。
5.提升硬件性能。这是最后一招了,如果其他方面都已经做得非常不错了,性能瓶颈在CPU,内存和磁盘上,那采取提升硬件性能的方案就会显得比较合适了,否则还是先去优化其他的地方吧。
以上5个层次的优化带来的性能改善,是依次下降的,是一个倒置的金字塔。
索引优化:
SET NOCOUNT { ON | OFF }
ON : 不返回计数(表示受 Transact-SQL 语句影响的行数)。
OFF: 返回计数。
即使当SET NOCOUNT 为 ON 时,也更新@@ROWCOUNT 函数。
当SET NOCOUNT 为ON 时,将不给客户端发送存储过程中的每个语句的DONE_IN_PROC 信息。当使用Microsoft SQL Server 提供的实用工具执行查询时,在Transact-SQL 语句(如 SELECT、INSERT、UPDATE 和 DELETE)结束时将不会在查询结果中显示"nn rows affected"。
如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。
SET NOCOUNT 设置是在执行或运行时设置,而不是在分析时设置。
权限:SET NOCOUNT 权限默认授予所有用户。
结论:我们应该在存储过程的头部加上SET NOCOUNT ON 这样的话,在退出存储过程的时候加上SET NOCOUNT OFF这样的话,以达到优化存储过程的目的。
可以对视图进行修改删除操作:
1. view的字段只涉及一个表。
2. 如果涉及多个表的话,被(涉及到的)view列所映射table列(或列的组合)必须是有主健约束,且修改时,修改的字段只能为组成视图的外键对应的其中一张基表信息,即一对多关系时,多的那一张表.
3. 强制执行,方法是加上hint /*+ BYPASS_UJVC */
例:
俩表关联:A表与B表一对一,那么A表与B表都可以改,但是只能改其中一张基表的数据.
俩表关联:A表与B表一对多,那么只能改B表的字段.
三表关联:A表与B表与C表一对一对一,那么都可以改,但是只能改其中一张基表的数据.
三表关联:A表与B表一对多,B表与C表一对多,那么只能改C表字段的数据.
三表关联:A表与B表一对多,B表与C表多对一,实际上就是多对多关系,那么全部都不能改.