分类目录归档:数据库

SQL Server 2012 的12个激动人心的功能

微软已经发布了众所期待的 SQL Server 2012,让我们来看看这个新版给我们带来了什么激动人心的功能吧。

1. AlwaysOn – 这个功能将数据库的镜像提到了一个新的高度。用户可以针对一组数据库做灾难恢复而不是一个单独的数据库。

2. Windows Server Core 支持 – Windows Server COre 是命令行界面的 Windows,使用 DOS 和 PowerShell 来做用户交互。它的资源占用更少,更安全,支持 SQL Server 2012。

3. Columnstore 索引 – 这是 SQL Server 独有的功能。它们是为数据仓库查询设计的只读索引。数据被组织成扁平化的压缩形式存储,极大的减少了 I/O 和内存使用。

4. 自定义服务器权限 – DBA 可以创建数据库的权限,但不能创建服务器的权限。比如说,DBA想要一个开发组拥有某台服务器上所有数据库的读写权限,他必须手动的完成这个操作。但是 SQL Server 2012 支持针对服务器的权限设置。

5. 增强的审计功能 – 现在所有的 SQL Server 版本都支持审计。用户可以自定义审计规则,记录一些自定义的时间和日志。

6. BI 语义模型 – 这个功能是用来替代“Analysis Services Unified Dimentional Model”的。这是一种支持 SQL Server 所有 BI 体验的混合数据模型。

7. Sequence Objects – 用 Oracle 的人一直想要这个功能。一个序列(sequence)就是根据触发器的自增值。SQL Serve 有一个类似的功能,identity columns,但是现在用对象实现了。

8. 增强的 PowerShell 支持 – 所有的 Windows 和 SQL Server 管理员都应该认真的学习 PowderShell 的技能。微软正在大力开发服务器端产品对 PowerShell 的支持。

9. 分布式回放(Distributed Replay) – 这个功能类似 Oracle 的 Real Application Testing 功能。不同的是 SQL Server 企业版自带了这个功能,而用 Oracle 的话,你还得额外购买这个功能。这个功能可以让你记录生产环境的工作状况,然后在另外一个环境重现这些工作状况。

10. PowerView – 这是一个强大的自主 BI 工具,可以让用户创建 BI 报告。

11. SQL Azure 增强 –  这和 SQL Server 2012 没有直接关系,但是微软确实对 SQL Azure 做了一个关键改进,例如 Reporint Service,备份到 Windows Azure 。Azure 数据库的上限提高到了150G。

12. 大数据支持 – 这是最重要的一点,虽然放在了最后。去年的 PASS(Professional Association for SQL Server)会议,微软宣布了与 Hadoop 的提供商 Cloudera 的合作。一是提供 Linux 版本的 SQL Server ODBC 驱动。主要的合作内容是微软开发 Hadoop 的连接器,也就是 SQL Server 也跨入了 NoSQL 领域。

SQL Server 2012 对微软来说是一个重要产品。微软把自己定位为可用性和大数据领域的领头羊。

原文链接,OSChina.NET 原创编译

MySQL自带的帮助文档

利用好MySQL自带的帮助文档,可以快捷的解决些问题(不必大动作的在MySQL官方网上查询):比如,当前版本是否支持某个功能,哪些函数;某个字段类型的取值范围;甚至忘了某个操作语法。以下举例说明下。

1) 按层次看帮助。

比如,显示所有可供查询的分类:

mysql> ? contents

这里列出的分类,又可以按“? 类别名称”对其内容进一步的查看。比如,支持哪些数据类型:

mysql> ? data types

在这列出的类型中,又可以进一步查看具体类型的具体介绍。比如:

mysql> ? char

以上看出,可以通过“? 类别名称”有层次性查找自己所有关心的主题内容。

2) 按关键字看帮助

mysql> ? show  // 可以列出show命令能查看什么

mysql> ? create table   // 可以查看create table的具体语法

 

MySQL使用索引的情况

索引是数据库优化很常见和重要的手段之一。 复习下在MySQL数据库中索引的使用情况。

一 使用的情况:

1)在复合索引中(即多列组成的索引),最左边的列才被使用索引。 比如order(order_id, user_id, user_name)中,为 (user_id, user_name)列创建索引,当按user_id查询SELECT * FROM order WHERE user_id = 2011,此时WHERE条件不是用的user_id和user_name复合索引,索引仍然会被使用,这也是索引的前缀特性。 但如果按user_name进行查询,索引则不可用。

2)在LIKE查询中,后边如果是常量且%不在首字符,索引才被使用。 如: 索引字段 LIKE ‘2011%’(索引被使用),但 LIKE ‘%2011’(索引不被使用)。

3)‘索引字段 is NULL’ 的情况将使用索引。

4) MEMORY/HEAP表的查询使用‘=’的条件下索引才起作用。

二 不使用的情况:

1)复合索引中,使用不是第一列的其它列进行查询时,不使用索引。

2) 使用索引比全表扫描更慢时不用索引。 比如 ‘id > 1 OR id < 10’(id是索引字段)。

3) MEMORY/HEAP表WHERE条件不使用‘=’进行索引列。

4) 在OR条件中,OR前的列是索引列,OR后的列不是索引列,那么索引列无效。

5)LIKE条件中%在第一位,不使用索引。

6)索引列如果是字符类型,对字符常量查询如果无引号,索引无效。比如 SELECT * FROM order WHERE user_name = 2011(user_name是索引列),此时查询有效,但索引无效(进行全表扫描)。 user_name=’2011’则索引被使用。

另外,我们通过SHOW STATUS命令了解各个SQL的执行频率(show status like ‘Handler_read%’查看索引的使用情况),EXPLAIN分析各个SQL执行计划,这涉及优化方面,再探讨。

简单的MySQL数据库安全策略

1)操作系统。在其OS(操作系统)上创建某一用户来专门运行MySQL,这样可以对此用户的权限加以限制来提高安全性。试想,如果在运行类似UNIX的OS,以root用户的身份运行MySQL服务器,这样可能赋予了一个MySQL普通用户读写OS任何地方的文件的权限。防止非管理员用户访问WEB服务器中的mysqladmin程序。另外,把MySQL服务器建立在Firewall(防火墙)后(这样可终止未授权主机的连接)或改变其默认端口,都可进一步提高其安全性。

2)密码。这是大家都比较熟悉的。务必为所有用户设置复杂的密码。如果需要在脚本文件保存密码(如db_connect.php),必须小心把此文件保存在WEB文档树结构以外,并且只能由特定的用户进行访问。

3)用户权限。利用MySQL权限系统,为每个用户配置其所配对的权限(即必须的,最少的,例如类型表只授予SELECT权限,订单表中只授予INSERT权限等),如果不是绝对需要,不要将GRANT,PROCESS,FILE,SHUTDOWN和RELOAD等权限授予任何非管理员的用户。建立用户时,其连接主机的权限也得加以确认,应该避免在主机名中使用通配符,还有在host表中使用IP地址而不是域名(这样可以在DNS位置避免错误问题)。

4)WEB问题。务必过滤来自用户的所有数据。

[DBNETLIB][ConnectionOpen (Invalid Instance()).]Invalid connection问题

这天把WIN2003+IIS 6.0 + SQL2000下某一个ASP网站转移到WIN2008 + IIS 7.0 + SQL2008时候,出现无法显示数据。输出错误为:[DBNETLIB][ConnectionOpen (Invalid Instance()).]Invalid connection。

Google下,原来需要在加上端口号。

之前连接字符:

“Provider=SQLOLEDB.1; User ID=帐号名; Password=密码; Data Source=IP; Initial Catalog=数据库名”;

现在改为:

“Provider=SQLOLEDB.1; User ID=帐号名; Password=密码; Data Source=IP, 1433; Initial Catalog=数据库名”;

问题解决。值得一提的是,注意Win2008自带的防火墙的设置,对安装SQL2008的安装,连接有影响。所以,出现有些情况,可以在这方面找下原因。

数据库范式

数据库范式指数据库设计所需要满足的规范。符合这些规范的数据库结构明晰,避免INSERT,DELETE和UPDATE操作异常。

1 第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性有基本类型构成(整型,实数,字符型,逻辑型,日期型等)。

在现有的DBMS中设计不符合1NF的数据库是不可能的(现有的DBMS不可以把某列再分2列或多列),所以可以“忽视”它。

2 第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。

比如:一个选课关系表select_course (学号, 姓名, 年龄, 课程名称, 成绩, 学分),关键字为组合字段(学号,课程名称),即(学号,课程名称)-> (姓名,年龄,成绩,学分)。

以上表并不符合2NF,因为(学号)-> (姓名,年龄);(课程名称)->(成绩,学分),即存在组合字段中的字段决定非关键字。

则存在问题有:

1)插入异常:

若想输入一门新课程,但还未有人选修(即没有“学号”这个关键字),便无法记录该新课程。

2)更新异常:

若调整了某一门课程的学分,则匹配该课程的所有行的学分都需要更新,否则出现一门课程多个学分情况。

3)数据冗余:

同一门课程由n个学生选修,”学分”就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。

所以,可改为以下几个表(符合2NF):

student (学号,姓名,年龄)

course(课程名称,学分)

select_course (学号,课程名称,成绩)

也可以发现,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。

3 第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段传递函数依赖

传递函数依赖,指的是如果存在“A -> B -> C” 的决定关系,则C传递函数依赖于A。

比如:student(学号,姓名,年龄,所在学院,学院地点,学院电话),关键字段为“学号”。这表符合2NF,但不符合3NF,因为有以下关系:

(学号)->(所在学院)->(学院地点,学院电话) (即存在非关键字段“学院地点”,“学院电话”对关键字段“学号”的传递函数依赖),其存在的异常就不再详述。

分解符合3NF的表如下:

学生:(学号,姓名,年龄,学院ID)

学院:(学院ID,学院地点,学院电话)

4 鲍依斯-科得范式(BCNF):在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖。

比如:仓库管理表store_manage(仓库ID,物品ID,管理员ID,数量)。一个管理员只能一个仓库工作,一个仓库可以存储多种物品,即有如下决定关系:

(仓库ID,管理员ID)->(物品ID,数量)

(管理员ID,物品ID)->(仓库ID,数量)

可以看出,(仓库ID,管理员ID)和(管理员ID,物品ID)都是表store_manage的候选关键字,“数量”是唯一的非关键字段,故符合3NF。但又可以看出有如下关系:

(仓库ID)->(管理员ID)和(管理员ID)->(仓库ID),存在关键字段觉得关键字段的情况,不符合BCNF。出现的异常情况有:

1)插入异常:

仓库不存在物品时,不可加入“管理员ID”

2)更新异常:

需要更改某个“管理员ID”,需要改动多行,如果某行未改动,则会存在一个仓库有2个或多个管理员。

3)删除异常:

若需要清空某一仓库,其所有的“物品ID”和“数量”清空的同时,“管理员ID”和“仓库ID”也被清空了。

修改(符合BCNF):

仓库表:store(仓库ID,物品ID,数量)

仓库管理表:store_manage(仓库ID,管理员ID)

5 还有4NF,5NF,极少用到,略过。

满足范式要求的数据库设计是结构清晰的,同时可避免数据冗余和操作异常等。在多个实践中,有时适当的冗余,即不符合范式要求的设计,可以换来性能效率的提高,这很值得考虑~

使用SQL的UPDATE语句进行联表更新

实例说明:

假设表1– tab_01,表2– tab_02

1)MSSQL:

UPDATE a SET a.字段 = b.字段 , a.字段2= b.字段2, …  FROM tab_01 AS a, tab_02 AS b WHERE a.ID = b.ID

2) Oracle:

UPDATE tab_01 a SET (a.字段1, a.字段2, …)= (SELECT b.字段1, b字段2, … FROM tab_02 b WHERE a.ID=b.ID)

3)MySQL:

UPDATE tab_01 a, tab_02 b SET a.字段1= b.字段1, a.字段2= b.字段2, …  WHERE a.ID=b.ID