SQL Server General
文章平均质量分 56
KevinLiu
SQL Server MVP
展开
-
SQL Server存储过程输入参数使用表值
在2008之前如果我们想要将表作为输入参数传递给SQL Server存储过程使比较困难的,可能需要很多的逻辑处理将这些表数据作为字符串或者XML传入。 在2008中提供了表值参数。使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据,这样可以省去很多自定义的代码。这样的操作对于存储过程内基于表函数的操作变得非常容易操作。原创 2013-08-16 09:36:35 · 2624 阅读 · 0 评论 -
序列化隔离级别Key-Range锁定的真实键范围
大家都知道在序列化隔离级别中引入了键范围锁定。键范围锁可防止其他事务插入其键值位于可序列化事务读取的键值范围内的新行,从而确保满足此要求。但是对于锁定的范围真的清楚吗? 前几天看到有人对于锁范围的疑问,发现锁定的数据比想象的要多。 下面我们看个例子:---create tableand insert test dataCREATE TABLE TEST(C1INTprim原创 2013-01-22 12:48:47 · 1712 阅读 · 0 评论 -
NDF文件丢失或者损坏是否可以成功附加数据库
曾经看到有人遇到过NDF文件损坏或者丢失想要通过MDF直接附加数据库,但是结果是失败。在网上也Google了一下看到很多人问这个问题,答案是不可以的。 来自MSDN:FORATTACH requires the following: · Alldata files (MDF and NDF) must be available.· Ifmultipl原创 2013-01-10 09:50:34 · 3646 阅读 · 0 评论 -
使用Filegroup的一些好处
针对于大的数据库,使用Filegroup可以给我们带来性能和维护上的诸多好处,比如: 1. 遇到磁盘瓶颈时可以增加磁盘,将经常访问的一些数据量大的表分散到不同的文件组,分散到不同的磁盘,这样可以提供IO的性能。 2. 如果非聚集索引非常大,可以考虑将非聚集索引和表分开放到不同的Filegroup,从而分散IO。 3. 如果数据库同时存在只读和读写的表,可以考虑将原创 2013-02-06 09:53:08 · 3274 阅读 · 0 评论 -
为什么一个Instance可以创建多个SA?不是大小写不敏感吗?
论坛有人在问是否SQL Server的账号可以区分大小写,其实是可以的,但是有前提。 很多人认为SQL Server只有密码才会区分大小写,而SQL登陆账户不会区分,其实不然。默认SQL Server Login账户是大小写不敏感的,但是如果你安装的SQL Server排序规则为大小写敏感的,那么SQL Server的Login账户也会是大小写敏感的(对于SA账户可以创建sa,Sa,s原创 2013-03-01 10:31:33 · 1361 阅读 · 0 评论 -
客户端和server网络中断后提交的批处理还会运行吗?
在网上看到有人提到这样的问题:客户端和server网络中断后提交的批处理还会运行吗? 这个问题涉及到了SQL server TCP连接的keepAlive。从微软的Blog找到详细的解释: 简单说,keepalive 是SQLserver在建立每一个TCP连接的时候,指定了TCP协议的keepaliveinterval和keepalivetime参数。这样对每个TCP连接,如果原创 2013-02-07 11:44:59 · 1454 阅读 · 0 评论 -
SQL Server Parallel Data Warehouse (PDW) 介绍
最近大数据概念非常火热,各个厂家都讲大数据视为未来IT的一个重要方向,因此各个厂家都想在这个领域有所作为。前几天参加了IBM大数据研讨会,会上IBM推出了他们针对于大数据的解决方案,三种一体机(PureSystem,另外IBM在推出了DB2 v10,为了打Oracle RAC专门设计的PureScale正式加入了DB2大版本中)。 在MPP架构方面,以前微软是被诟病的,缺乏产品应对大数据的原创 2013-01-05 14:01:07 · 3855 阅读 · 0 评论 -
SQL Server如何创建统计信息
前几天在论坛看到有人在问为什么一张表上看不到SQL Server统计信息,这张表是新创建的HEAP表,并且没有索引,从来没有被访问过。 其实回答这个问题就要回到SQL Server是如何创建并且维护统计信息的。 SQL Server会在下面三种情况下创建统计信息: 1.在索引创建时SQL Server会自动在索引所在的列上创建统计信息 2.当SQL Server想要使用某些翻译 2012-11-06 09:15:39 · 1653 阅读 · 0 评论 -
SQL Server 支持各种对象的最大数
看到论坛里很多人问道关于SQL Server能够支持最多多少个数据库,多少个实例,多少张表,每个表最多多少个字段等等的问题。 在MSDN上有一篇文章专门介绍了SQL Server的容量规范,其中包括了SQL Server数据库引擎对象SQL Server实用工具对象 SQL Server 数据层应用程序对象SQL Server复制对象。明白了SQL Server的限制可以避免一些错误,原创 2012-10-21 20:17:26 · 2339 阅读 · 0 评论 -
Msg 547 The ALTER TABLE statement conflicted with the CHECK constraint "".
创建约束出现下面的错误: Msg 547, Level 16,State 0, Line 2The ALTER TABLEstatement conflicted with the CHECK constraint "chk_id". The conflictoccurred in database "test", table "dbo.test_CONSTRAINT",column原创 2012-10-19 11:59:28 · 1831 阅读 · 0 评论 -
你关注过Linked Server OLE DB选项吗?
曾经遇到过一个由于第三方的OLE DB创建的Linked Server 导致SQL Server Crash的案例,最后的解决办法是修改OLE DB Provider选项“Allow inprocess”。所以解决Linked Server的某些问题还是要知道这些选项的含义。这里我将这些选项以及解释列出来,希望能够对大家有所帮助: Provider opti原创 2012-10-27 16:10:07 · 2212 阅读 · 0 评论 -
使用FULL OUTER JOIN拼接多表数据
今天帮用户修改一个报表,里边设计到出库和入库的操作,要将每个产品每天的出入口信息列出来。 可能存在这样的情况: 1. 产品在出库表中存在数据但是入库表中没有数据2. 产品入库表中存在数据但是出库表中没有数据 所以这个Report直接使用INNER JOIN或者Left join/Right Join连接两张表都得不到想要的数据。当时Report的开发者的思路原创 2012-10-18 17:20:21 · 5735 阅读 · 0 评论 -
SQL Server 预读和物理读 的区别
今天在网上看到有人在讨论预读和物理读的区别,个人觉得物理读和预读都是IO操作,都是需要从磁盘中读取数据到内存,只是读取的时间有所不同,之后查了一下MSDN确认了这种想法。 预读是在生成执行的同时去做的,通过这种方式可以提高IO的性能。而物理读是当执行计划生成好后去缓存读取数据发现缺少数据之后才到磁盘读取。当所有数据都从缓存中可以读取就变成读。 下面举个例子: LINEITE原创 2012-10-12 20:49:37 · 2178 阅读 · 1 评论 -
使用DBCC CHECKPRIMARYFILE 查询Detach数据库信息
在论坛碰到有人问到无法Attach数据库的问题,错误信息为: Msg 5171, Level 16, State 1, Line2“path\allen_log.ldfis not a primary database file. 很明显这个错误表示Attch数据库选择的文件不是主数据库文件,但是看附加的数据文件确实是MDF结尾的。问用户是否有多个MDF文件,用户说是,但是他确原创 2013-01-16 11:27:45 · 2892 阅读 · 0 评论 -
dbcc extentinfo 查看磁盘分区 分析压缩数据库对象
DBCC EXTENTINFO命令用于查询某个数据库、或者某个数据对象(主要是数据表)的盘区分配情况,然后计算每个对象理论上区的数目和实际数目,如果实际数目远大于理论的数目,那这个对象就是碎片过多,管理员应该要考虑重建对象 建立下面的存储过程帮助分析:create table extentinfo ( [file_id] smallint, pa转载 2013-02-04 20:27:20 · 1308 阅读 · 0 评论 -
使用UDL测试SQL Server连接问题
做数据库经常会遇到SQL Server连接的问题,很多时候客户端没有安装SQL Server工具,可以通过Telnet或者Ping命令判断问题,但是针对于不懂的用户可能没有说服性。最好有一个图形化的界面。 其实我们可以通过创建一个UDL(Universal Data Link)文件测试,步骤: 1. 创建一个txt文件 2. 将txt文件后缀名修改为UDL原创 2013-07-25 16:36:31 · 2475 阅读 · 0 评论 -
在SQL Server中如何快速查找DBCC命令和语法?
DBCC命令非常好用,但是命令很多语法就很多,如何快速记忆呢?是否都要背下来。其实不用,只要能知道每个命令的作用并且记住DBCC HELP命令就可以了。 --查找所有的DBCC命令DBCC HELP('?');GO --比如想看CHECKDB的语法DBCC HELP('checkdb');GO --结果如下dbcc checkdb(原创 2013-07-25 11:39:01 · 1505 阅读 · 0 评论 -
SQL Server 等待资源解释
很多人都遇到过Blocking的问题,查询的时候会看到等待的资源,但是这些代表什么含义呢? CompileFormatExampleTableDatabaseID:ObjectID:IndexIDTAB: 5:261575970:1 In this case, database ID 5 is th原创 2013-07-05 10:30:01 · 1814 阅读 · 0 评论 -
尝试SQL Server 2014 OLTP memory-optimized表遇到的问题
SQL Server 2014引入了内存数据库,这是个非常好的功能。数据可以直接在内存中,这样可以直接对内存进行操作,性能有很大的提高。今天想到一个问题,如果表增长的大了,而数据库内存不够会出现什么样的情况。因为微软的MSDNS上是这样写的额:A computer with enough memory to hold the data in memory-optimized tab原创 2013-06-30 18:55:10 · 2848 阅读 · 0 评论 -
重建SQL Server 2005/2008丢失的Performance counter
有时候会发现需要监控SQL Server性能的时候发现Perfom中没有SQL Server的Counter,用下面的方法可以重新加载SQL Server Perfom counter. 注意这个操作完成后需要重启SQL Server servcie,所以需要找Maintaince的时间做下面的操作。1.First you need to identify which .ini原创 2013-06-30 20:39:43 · 1499 阅读 · 0 评论 -
Msg 208 : Invalid object name 'SysObjects'
查询SysObjects出现下面的错误: Msg 208, Level 16, State 1, Line 2Invalid object name 'SYSOBJECTS'. 可能的原因是数据库大小写敏感。If your database is created with a Case Sensitive collation then all object names will b原创 2013-06-28 14:09:50 · 3415 阅读 · 0 评论 -
转换fn_dblog的十六进制Current LSN格式
今天想查看一个LSN是否包含在日志备份,但是发现restore headeronly里面的LSN格式跟fn_dblog的不同,不过可以通过下面的方法转化。 Create DatabaseTestLSN;Go-- Make sure it is simple recoveryAlter DatabaseTestLSN Set Recovery full;GoU原创 2013-06-18 11:12:13 · 2503 阅读 · 0 评论 -
SSIS Foreach 如何限定两种文件扩展名?
在论坛看到有用户希望在SSIS中包含两种文件的扩展名称(比如只需要csv,txt),默认的功能是无法完成的。只能用*.*包含所有的文件或者单个文件扩展名称。 有两个Workaround可以实现: 1. 使用Script功能,进行文件扩展名判断,具体步骤参考: Regex filter for Foreach Loop 2. 可以自定义原创 2013-06-06 15:38:04 · 1669 阅读 · 0 评论 -
键范围锁定(Key-Rang Lock)是不是只在序列化级别中出现
以前一直认为键范围锁定只是在序列化隔离级别中才会出现,但是从论坛的一篇帖子中看到Read-Committed隔离级别中竟然也出现了: 59:50. spid24s process id=process6463b88 taskpriority=0 logused=480 waitresource=KEY: 6:72057594065715200 (8500ea663c04) waittime原创 2013-06-06 11:46:45 · 1570 阅读 · 0 评论 -
SQL Server 变量名称的Collcation跟Instance还是跟当前DB?
使用SQL Server变量的时候碰到变量名称大小写的问题: 当前数据库是大小写不敏感的,但是声明变量之后发现变量名称是大小写敏感的。一直认为SQL Server的变量名称的Collcation是跟当前数据库的,在MSDN:You cannot specify a collation for character variables and parameters; they原创 2013-05-23 09:20:59 · 1648 阅读 · 0 评论 -
撤销单个UPDATE语句是否造成数据损失?
在论坛看到有人执行了一个UPDATE,但是发现错了,问是否可以取消这个更新操作。因为涉及的数据比较多,所以怕取消操作造成数据不一致。 其实对于单独的UPDATE操作而言,都是当做一个隐性事务处理的,具有ACID属性,Non或者All.所以不管这个UPDATE会影响多少行,取消操作所有影响的行都会回滚,保证事务完整性。 下面的解释来自SQL SERVER 2008 INTERNALS原创 2013-03-20 12:59:15 · 2111 阅读 · 0 评论 -
SQL Server System Session ID是不是1-50?
今天在论坛看到一篇文章问到为什么SQL Server系统的SESSION ID是从1到50的,以前看过文章,这些Session是SQL Server为了运行系统活动比如((lazy writer, ghost record cleanup, DTC commit/abort),所以会保留50 Session ID给SQL Server使用,用户会话从51开始。 在2005之前查询用户会话使原创 2012-10-09 10:13:07 · 1344 阅读 · 0 评论 -
查询当前Connection使用的协议(Named Pipe or TCPIP)
SELECT ConnectionProperty('net_transport')AS 'Net transport',ConnectionProperty('protocol_type')AS 'Protocol type' SELECTnet_transport,protocol_type,local_net_address,client_net_address原创 2012-10-09 11:54:20 · 1416 阅读 · 0 评论 -
How does SQL Server really store NULL-s
Each row has a null bitmap for columns that allow nulls. If the row in that column is null then a bit in the bitmap is 1 else it's 0.For variable size datatypes the acctual size is 0 bytes.For fix转载 2012-09-13 09:50:33 · 1261 阅读 · 0 评论 -
数据库恢复过程中查看恢复数据
相信很多人都遇到过数据被误删除然后要求DBA将数据还原回来,但是用户只知道发生的大概时间。这个时候查看备份可能看到有两个备份的时间跟错误发生的时间差不多。如果你还原到最后一个的话,可能查看数据发现已经出问题了,那么你得重新来一遍。如果Log很多的话这个是很花时间的。今天看到ORACLE的恢复原理中有这么一句话:Beforeusing the OPEN RESETLOGS c原创 2012-07-25 12:23:26 · 1017 阅读 · 0 评论 -
数据库采用SSD效率会高吗?
NOR和NAND都是闪存技术的一种,NOR是Intel公司开发的,它有点类似于内存,允许通过地址直接访问任何一个内存单元,缺点是:密度低(容量小),写入和擦除的速度很慢。NAND是东芝公司开发的,它密度高(容量大),写入和擦除的速度都很快,但是必须通过特定的IO接口经过地址转换之后才可以访问,有些类似于磁盘。 我们现在广泛使用的U盘,SD卡,SSD都属于NAND类型,厂商将flash m转载 2012-07-24 14:37:23 · 5598 阅读 · 1 评论 -
SQL Server更改表数据类型View中Column数据类型没有相应改变
今天有个供应商问我一个问题如果更改表中一个字段的数据类型是不是View中的字段类型也响应自动更改。当时我想应该是会自动更改的。但是供应商说他们试过了不会更改的,问我除了重新建有没有什么办法。当时想到了刷新View的存储过程sp_refreshview,让他们试一下。执行之后View中的数据类型就被更新了。通过这个例子可以看到View中的字段类型是不会同步的除是schema-boun原创 2012-07-24 14:35:56 · 1171 阅读 · 0 评论 -
Top 25 DBA Worst Practices
Not considering service levelagreements (SLAs) when designing a database environment and/or not consideringthe need for scheduled downtime for service pack/hotfix application,Defining "disaster" too转载 2012-07-25 12:22:32 · 686 阅读 · 0 评论 -
通俗的例子解释SQL的各种运行状态
The SQL Server SQLOS uses schedulersto manage the execution of user requests. SQLOS Schedulers map to CPUs. Assuminga 4-CPU Server, there would be 4 SQLOS schedulers by default. The following diagra转载 2012-07-24 10:13:55 · 871 阅读 · 0 评论 -
如何维护SQL Defalt Trace历史信息
Default Trace用途默认跟踪可确保数据库管理员在问题首次出现时即具有诊断该问题所需的日志数据,从而为数据库管理员提供了故障排除帮助。由于Default Trace保存了大量有用的信息,可以快速帮助我们做Audit或者Troubleshooting,所以保留历史信息也是很有用的。解决方法:1.首先创建数据表用来存储Trace信息,然后将现有的Defatult trace原创 2012-07-24 14:26:49 · 961 阅读 · 0 评论 -
不更改数据库默认隔离级别,如何避免丢失更新(lost update)
在默认的隔离级别下先读出数据然后再去修改可能会产生Lost update,但是如果提高隔离级别的话又会降低并发,使用下面的办法可以在Read commited隔离级别上避免Lost update.1.可以使用衍生列比如timestamp.在更新之前先做检查,如果更新的时候发现 timestamp列已经更改说明列已经被修改了,报错。2.使用存储过程,如果更新返回的值为0,说明之前数据已经被更原创 2012-07-23 10:10:14 · 4476 阅读 · 0 评论 -
灾难:正式数据库和测试测试数据库在一台服务器
曾经看到很多人喜欢将测试数据库和正式数据库放到一台服务器上,认为这样可以节省资源。虽然正式和测试分成两个实例配置,安全性上不会有问题,但是性能和维护上会有很多问题。 1. 维护:一般来说测试服务器不需要什么高可用性,测试需要停机就可以停机,不需要跟用户去做沟通。但是对于正式服务器都是有业务在跑的,而且有SLA的限制,不能说停就停。所以放到一起,测试服务器就失去了灵活性。 2.性能:原创 2012-08-09 13:25:42 · 3300 阅读 · 0 评论 -
数据库硬件选择
虽然大家使用的数据库可能不一样,但是整体的思路都是一样的。下面的文章对于选择数据库硬件有指导意义:So you need to purchase a new database server, and you really don’t know where to start..Because their maybe different recommendations for differ转载 2012-07-26 17:03:34 · 984 阅读 · 0 评论 -
如何获得64位 Jet Driver
以前SQL Server可以用JET直接访问Excel的数据,非常方便。但是现在使用64位的SQL Server会遇到问题,因为微软没有提供64位的Jet驱动程序,可以参考:Kb 957570 我们不提供 Microsoft OLE DB 提供程序的 64 位版本的 Jet。此外,我们不提供 64 位版本的 Jet ODBC 驱动程序。如果您使用 MicrosoftOLE DB 提供程序为原创 2012-09-06 16:28:22 · 3947 阅读 · 0 评论 -
ISDATE函数对于1753年之前的日期都返回0
今天看到一个帖子,将1753年之前的一个日期用ISDATE函数会返回0,自己也做了多个测试,发现确实如此: declare @date asdate set @date =convert(date,'17000101') print @date --可以转化为Date类型 print ISDATE('17000101') 结果确实返回0: 1700原创 2012-08-31 23:17:59 · 2158 阅读 · 1 评论