微软正式发布SQL Server的MapPoint插件

26. 八月 2009

微软刚刚发布了一款针对SQL Server 2008空间数据的免费MapPoint 2009插件。该插件可和MapPoint一块用于查询SQL Server 2008空间数据以建立图解地图。要使用该插件,必须要有SQL Server 2008和MapPoint北美版或MapPoint欧洲版。Mappoint的两个版本都可免费体验。

MapPoint插件已可下载,微软还提供了入门视频教程

MapPoint是一款商用地图应用程序,用微软的说法是“集成地图、人口数据和地理数据的商业解决方案”。MapPoint插件则被描述为“入门级的地图解决方案”,非企业级解决方案。

MapPoint插件对使用微软工具集的开发团队有以下诱人的功能:

  • 由于MapPoint数据可以是本地数据,故它有无需网络连接的完整地图函数
  • 地图和数据一起保存,无需SQL Server亦可使用
  • SQL Server 2008空间数据类型易于理解
  • ESRI和MIF文件导入的支持

对使用其它企业地图解决方案的机构,MapPoint插件除了搭建简洁快速的SQL Server 2008空间数据可视化以外作用不大。

查看英文原文:MapPoint Add-In For SQL Server Released

数据库技术 ,

新版SQL Enlight T-SQL分析器发布

6. 五月 2009

Ubitsoft发布了新版本的SQL Enlight,这是一款用于加速并简化T-SQL开发的工具。与StyleCop/FxCop类似,SQL Enlight提供了代码约定校验和代码标准增强的功能;同时还提供了类似于ReSharperCodeRush的设计期分析和模板功能。SQL Enlight可集成到MS Visual Studio及SQL Management Studio中,同时还提供了一个命令行接口和MSBuild tasks以生成分析规则违例的XML报告。

SQL Enlight具有如下特性:

  • 根据定制规则重新格式化T-SQL

    我们可以将格式化规则按照组的方式放到layout模板中,同时还可以根据需要在不同模板间进行切换。

  • 根据静态分析规则分析T-SQL代码

    Analysis Script特性可以识别出T-SQL代码中常见的性能和数据库对象命名问题。

  • 概要T-SQL脚本

    与Class Viewer类似,Transact-SQL Script Summary可以帮助开发者和数据库管理员识别出长SQL脚本组件。Script Summary提供了对当前T-SQL脚本中所有批处理和语句的一个继承结构的概要。

  • 重构——将T-SQL脚本封装成存储过程或函数

  • Transact-SQL语句大纲

    语句大纲特性用一个个矩形将T-SQL脚本中每条语句包围起来,就像.NET代码中的regions一样。

  • 验证T-SQL语法

    代码编辑器可以对T-SQL的语法错误进行高亮显示

查看英文原文:SQL Enlight T-SQL Analyzer

数据库技术

SQL Server 2005 SP3正式版发布了

16. 十二月 2008
微软今天发布了SQL Server 2005 SP3的正式版,而这也将是该软件的最后一次升级服务,不过暂时只有英文版本,需要简体中文版的用户请稍等。SQL Server 2005 SP3版本号9.00.4035,作为一个累计升级包集成了此前所有的更新补丁,能全方位提升SQL Server 2005的各种服务等级,适用于企业版、企业评估版、开发者版、标准版、工作组版等所有商业版本。

 下载地址(x86/x64/IA64):

http://www.microsoft.com/downloads/details.aspx?FamilyID=ae7387c3-348c-4faa-8ae5-949fdfbe59c4&DisplayLang=en

针对免费的精简版SQL Server 2005 Express Edition,微软也放出了相应的SP3服务包,不过要注意,SQLEXPR.EXE可以在32/64位系统上安装,SQLEXPR32.EXE则只能用于32位系统。

下载地址:
http://www.microsoft.com/downloads/details.aspx?FamilyID=3181842a-4090-4431-acdd-9a1c832e65a6&DisplayLang=en

相关资源——

知识库文章KB921896(尚未更新):
http://support.microsoft.com/kb/921896/en-us

发行说明(简体中文):
http://download.microsoft.com/download/9/5/6/95670958-FB34-45E7-90F6-E10E565DD122/ReleaseNotesSQL2005SP3.htm

SQL Server 2005 2008.12功能包:
http://www.microsoft.com/downloads/details.aspx?FamilyID=536fd7d5-013f-49bc-9fc7-77dede4bb075&DisplayLang=en

SQL Server 2005 Express Edition Toolkit SP3(精简版工具包):
http://www.microsoft.com/downloads/details.aspx?FamilyID=d434dc36-a24d-44ee-937e-553c382557e3&DisplayLang=en

SQL Server 2005 Express Edition with Advanced Services SP3:
http://www.microsoft.com/downloads/details.aspx?FamilyID=b448b0d0-ee79-48f6-b50a-7c4f028c2e3d&DisplayLang=en

SQL Server Management Studio Express SP3 (SSMSE):
http://www.microsoft.com/downloads/details.aspx?FamilyID=5d76230d-580d-4874-8c7d-93491a29db15&DisplayLang=en

数据库技术

高性能网站建设之MS Sql Server数据库分区

27. 十一月 2008

什么是数据库分区?
数据库分区是一种对表的横向分割,Sql server 2005企业版和之后的Sql server版本才提供这种技术,这种对表的横向分割不同于2000中的表分割,它对访问用户是透明的,用户并不会感觉的表被横向分割了。(2000中的表横向分割是建n个表例如按时间建表每月一个表,表名不同,最后需要做一个大视图)

关于具体的如何做分区,请参考数据库分区演练http://www.cnblogs.com/yukaizhao/archive/2008/05/07/sql_partition_test.html

为什么要分区?
显而易见分区是为了提高数据库的读写性能,提高数据库的效率;

分区是否总是可以提高效率?
分区是一把双刃剑,并不总能提高效率,这和具体情况有关系。
之所以有分区技术,分区技术用的好的话可以提高性能,是因为一方面分区把一大块数据分成了n小块,这样查询的时候很快定位到某一小块上,在小块中寻址要快很多;另一方面CPU比磁盘IO快很多倍,而硬件上又有多个磁盘,或者是RAID(廉价磁盘冗余阵列),可以让数据库驱动CPU同时去读写不同的磁盘,这样才有可能可以提高效率。
分区在有些时候并不能提高读写效率,比如说我们经常看到的按照日期字段去分区MSDN例子,这个实例中是按照记录的生成时间来分区的,把一年的数据分割成12个分区,每月一个。这样的分区导致分区并不能实现CPU同步写并提高写入性能,因为在同一个时段CPU总是要写入到最新的那一个分区对应的磁盘中。另一个问题是:这样分区是否可以提高读取性能呢?答案是不一定,要看根据什么字段来查询,如果是根据时间来查询,根据时间生成报表那么这种分区肯定会提高查询的效率,但是如果是按照某个客户查询客户最近1年内的账单数据,这样数据分布到不同的分区上,这样的话效率就不一定能提高了,这要看数据在同一个分区上连续分布的读性能高,还是CPU从几个磁盘上同步读取,然后在合并数据的性能更高一些,这和读取数据的记录数也有关系。

如何分区?用什么字段做分区依据?
具体如何分区和涉及的业务有关系,要看业务上最经常的写入和读取操作是什么,然后再考虑分区的策略。

既然与具体业务相关,我们就假定一个业务环境,假如我们要做一个论坛,对论坛的帖子和回复表进行分区。
论坛中最常见的写操作是1)发帖 2)回复帖子,
最常见的读操作是
1) 根据帖子id显示帖子详情和分页的帖子回复
2) 根据帖子版面帖子列表页根据版面id分页读取帖子列表数据
怎么分区更合适呢?现在还没有准确答案,我有两种可能的方案,写下来,大家讨论看看。
方案1. 根据帖子ID区域段分区(1-300w一个分区、300w-600w一个分区…),这样理论上可以提高帖子详细页的读取速度,而对于写操作性能没有益处,对于根据版面id读取帖子列表页有可能有益
方案2. 根据版面id进行分区,这样对于写性能应该有提高,不同的分区对应不同的版面,当有两个版面同时有发帖回帖操作时,有可能可以并发写。对于根据版面id获得帖子列表页数据也可以提高性能,而对于帖子详细信息页没有性能影响。

多大的数据量才需要分区?
这个问题我只能说一个内部标准,如果一张表的记录超过在超过1000w,并以每月百万的数据量增长,那就需要分区。大家有不同的看法请回复讨论

关于具体的如何做分区,请参考数据库分区演练http://www.cnblogs.com/yukaizhao/archive/2008/05/07/sql_partition_test.html

本文转自:玉开的技术博客

数据库技术 ,

数据库中的命名规则

30. 十月 2008

数据库涉及字符规则

  采用26个英文字母(区分大小写)和0 -9这十个自然数,加上下划线_组成,共63个字符。不能出现其他字符(注释除外)。

据库对象命名规则

  数据库对象包括表、视图(查询)、存储过程(参数查询)、函数、约束。对象名字由前缀和实际名字组成,长度不超过30。前缀:使用小写字母。

  例如:

tb
视图 vi
存储过程 sp
函数 fn

实际名字

  实际名字尽量描述实体的内容,由单词或单词组合,每个单词的首字母大写,其他字母小写,不以数字和_开头。
  例如:

User_Info
视图 UserList
存储过程 UserDelete


  因此,合法的对象名字类似如下。

tbUser_Info、tbMessage_Detail
视图 vi_MessageList
存储过程 sp_MessageAdd

数据库表命名规则

  字段由前缀和实际名字组成。实际名字中首单词一个系统尽量采取同一单词。
  前缀:使用小写字母tb,表示表。
  例如:tbMember
     tbMember_Info
     tbForum_Board
     tbForum_Thread1

字段命名规则

  数字、字符、日期/时间、lob(大对象)、杂项,字段由表的简称、下划线,实际名字加后缀组成。
  后缀:使用小写字母,代表该字段的属性。
   例如:  User_Idint
       User_Namestr
       User_RegDatedtm

视图命名规则

    字段由前缀和实际名字组成,中间用下划线连接。
    前缀:使用小写字母vi,表示视图。
    例如:vi_User
       vi_UserInfo

存储过程命名规则

    字段由前缀和实际名字组成,中间用下划线连接。
    前缀:使用小写字母sp,表示存储过程。
    例如:sp_User

数据库设计文档规则

  所有数据库设计要写成文档,文档以模块化形式表达。大致格式如下:
  '-------------------------------------------
  '  表名:  tbUser_Info  
  '  建立人:UAM_Richard
  '  日期:  2004-12-17
  '  版本:  1.0
  '  描述:  保存用户资料
  '  具体内容:
  '  UserId  int,自动增量  用户代码
  '  UserName  char(12)  用户名字
  '  ......
  '--------------------------------------------

sql语句规则

  所有sql关键词全部大写,比如SELECT,UPDATE,FROM,ORDER,BY等。

数据库技术

用C#压缩和修复Access数据库

30. 十月 2008

介绍

        下面这段C# 代码可以用来压缩和修复Access数据库,不管它是一个简单的".mdb"还是一个".mdw"网络共享数据库,这个过程和你在用MS Access应用程序中使用的"工具-数据库实用工具-压缩和修复"时执行的操作完全一样.实例代码使用了"迟绑定"(运行中在内存中建立COM对象),这样就不需要在工程中加入COM引用了,也不需要在PC上安装MS Access应用程序.只需要一个Jet引擎(Jet引擎包含在MDAC安装包中,在Windows NT4以后的版本中,系统已经自带了这个引擎).

背景

        不知你是否也厌烦了在工程中加入复杂的COM库引用,但我相信这个纯.NET代码将省去额外的交互操作, RCWsCOM引用.基本上,由于系统中安装的Microsoft类库的不同(例如:MS Office Object Library 9,10,11等等),我们也不知道用户PC中安装的Office版本,所以我们要通过ProgID来访问COM对象,而不能用CLSID.例如,当调用"Excel.Application",,得到的是Excel,而不管系统中安装MS Office的版本,当在代码中加入"MS Excel 10 Object library"引用时,其实只是给应用程序加入了一个非常受限制的功能.所以我们使用System.Reflection和迟绑定.

1. 实例代码

只需调用CompactAccessDB函数即可压缩和修复目标数据库.

2. 参数:
  • connectionString 用来连接到Access数据库.
  • mdwfilename要压缩的MDB文件的全名(路径+文件名).

由于Jet引擎的限制,执行此方法压缩Access数据库会把结果生成为一个新文件,所以我们要还需要把这个新的Access文件拷贝到目的位置覆盖原来未压缩文件.

当调用此方法时请确认被压缩数据库无打开的连接.

代码如下:

/// <summary>
/// 压缩数据库
/// </summary>
/// <param name="connectionString">数据库链接</param>
/// <param name="mdwfilename">要压缩的MDB文件的全名</param>
private void CompactAccessDB(string connectionString, string mdwfilename)
{
try
{
object[] oParams;

object objJRO = Activator.CreateInstance(Type.GetTypeFromProgID("JRO.JetEngine"));

oParams = new object[] { connectionString, "Provider=Microsoft.Jet.OLEDB.4.0;Data" + " Source=" + HttpContext.Current.Request.PhysicalApplicationPath + "tempdb.mdb;Jet OLEDB:Engine Type=5" };

objJRO.GetType().InvokeMember("CompactDatabase", System.Reflection.BindingFlags.InvokeMethod, null, objJRO, oParams);

System.IO.File.Delete(mdwfilename);
System.IO.File.Move(HttpContext.Current.Request.PhysicalApplicationPath + "tempdb.mdb", mdwfilename);

System.Runtime.InteropServices.Marshal.ReleaseComObject(objJRO);
objJRO = null;
}
catch (Exception)
{
Response.Write("数据库压缩中出现错误!");
}
}

注意事项

Jet Engine 5 用于 JET4X 数据库. 使用时要留意下表:

Jet OLEDB:Engine Type

Jet x.x Format MDB Files

1

JET10

2

JET11

3

JET2X

4

JET3X

5

JET4X

数据库技术

清除SQLServer日志的方法

30. 十月 2008
 一种方法:清空日志。

  1.打开查询分析器,输入命令
  DUMP TRANSACTION 数据库名 WITH NO_LOG

  2.再打开企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了。

  另一种方法:有一定的风险性,因为SQL Server的日志文件不是即时写入数据库主文件的,如处理不当,会造成数据的损失。

  1: 删除LOG
  分离数据库 企业管理器->服务器->数据库->右键->分离数据库

  2:删除LOG文件
  附加数据库 企业管理器->服务器->数据库->右键->附加数据库

  此法生成新的LOG,大小只有500多K。

  注意:建议使用第一种方法。

  如果以后,不想要它变大。

  SQL2000下使用:
  在数据库上点右键->属性->选项->故障恢复-模型-选择-简单模型。

  或用SQL语句:
  ALTER DATABASE 数据库名 SET RECOVERY SIMPLE

  另外,数据库属性有两个选项,与事务日志的增长有关:

  TRUNCATE LOG ON CHECKPOINT
  (此选项用于SQL7.0,SQL 2000中即故障恢复模型选择为简单模型)

  当执行CHECKPOINT 命令时如果事务日志文件超过其大小的70% 则将其内容清除在开发数据库时时常将此选项设置为True

  AUTO SHRINK
  定期对数据库进行检查当数据库文件或日志文件的未用空间超过其大小的25%时,系统将会自动缩减文件使其未用空间等于25% 当文件大小没有超过其建立时的初始大小时不会缩减文件缩减后的文件也必须大于或等于其初始大小对事务日志文件的缩减只有在对其作备份时或将Truncate log on checkpoint 选项设为True 时才能进行。

数据库技术

Asp.Net 备份和恢复SQL SERVER 数据库

30. 十月 2008

    我们通常备份数据库时,需要登录数据库服务器去备份和恢复,这样很不方便,其实SQL SERVER自带的命令可能让我们很简单地实现远程通过Asp.Net备份和恢复数据库。

BACKUP DATABASE '被备份的数据库名' TO DISK = '备份文件路径';
ALTER DATABASE '被恢复的数据库名' SET OFFLINE WITH ROOLBACK IMMEDIATE;
RESTORE DATABASE '被恢复的数据库名' FROM DISK = '备份文件路径';
ALTER DATABASE '被恢复的数据库名' SET ONLINE WITH ROOLBACK IMMEDIATE;

   简单几条命令就可以完成数据库的备份和恢复,在Asp.Net中,可以像调用Sql语句一样调用这四条语句,轻轻松松实现SQL SERVER数据库的备份和恢复。

   例子(以Northwind为例):
   1、备份Northwind数据库到C盘根目录下,以'Northwind.bak'为名:
        BACKUP DATABASE 'Northwind' TO DISK = 'C:\Northwind.bak';

   2、恢复Northwind数据库,C盘根目录下的'Northwind.bak'备份文件:
       a、将数据库置于离线状态
           ALTER DATABASE 'Northwind' SET OFFLINE WITH ROOLBACK IMMEDIATE;
       b、恢复Northwind数据库
           RESTORE DATABASE 'Northwind' FROM DISK = 'C:\Northwind.bak';
       c、将数据库置于在线状态
           ALTER DATABASE 'Northwind' SET ONLINE WITH ROOLBACK IMMEDIATE;

数据库技术

SqlServer 数据分页的存储过程

30. 十月 2008

    通常用普通的SQL语句查询数据,在数据量少的情况下速度上没什么感觉,一旦数居量很大之后,速度会明显变慢,因为大量的数据在网络中传输会花掉不少的时间,如果使用了分页查询数据,只反回有用的数据,把不需要的数据排除后,传输速度会快很多,如下是一个SQL分页的存储过程,本过程是以SQL自带的 Northwind 数据库为例写的,可以根据自已的需要随意更改

CREATE
PROCEDURE [GetCustomersDataPage]
@PageIndex INT, --页号
@PageSize INT, --页数
@RecordCount INT OUT, --记录数
@PageCount INT OUT --页数
AS
SELECT @RecordCount = COUNT(*) FROM Customers
SET @PageCount = CEILING(@RecordCount * 1.0 / @PageSize)

DECLARE @SQLSTR NVARCHAR(1000)

IF @PageIndex = 0 OR @PageCount <= 1
SET @SQLSTR ='SELECT TOP '+STR( @PageSize )+' CustomerID, CompanyName,Address,Phone FROM Customers ORDER BY CustomerID DESC'

ELSE IF @PageIndex = @PageCount - 1
SET @SQLSTR =' SELECT * FROM ( SELECT TOP '+STR( @RecordCount - @PageSize * @PageIndex )+' CustomerID, CompanyName,Address,Phone FROM Customers ORDER BY CustomerID ASC ) TempTable ORDER BY CustomerID DESC'

ELSE
SET @SQLSTR =' SELECT TOP '+STR( @PageSize )+' * FROM ( SELECT TOP '+STR( @RecordCount - @PageSize * @PageIndex )+' CustomerID, CompanyName,Address,Phone FROM Customers ORDER BY CustomerID ASC ) TempTable ORDER BY CustomerID DESC'

EXEC (@SQLSTR)

GO

数据库技术