在SQLServer处理中的一些问题及解决方法 NEWSEQUENTIALID()

时间:2021-09-30 18:14:15

一、DBLINK性能问题
select * from dbsource.dbname.dbo.table where guid in (
select guid from tablechangelog 
where tablename='table ' and id<110000)
这个运行居然要40秒以上。
后来分析了一下
1、table和tablechangelog是在不同的服务器上
2、在tablechangelog有230万记录,ID是聚集索引
     在table上guid是主键,大概有30万条记录
解决步骤
首先执行select guid from tablechangelog where tablename='table ' and id<110000,发现时间忽略不计
再次还原到同一台服务器上测试运行,发现只要1秒
select * from table where guid in (
select guid from tablechangelog 
where tablename='table ' and id<110000)
也就是说该SQL语句性能瓶颈在于网络,而不是SQL本身。
既然问题在于网络,那应该可以通过减少数据网络传递来解决部分
登陆到目标服务器上执行
select * from table where guid in (
select guid from dbdest.dbname.dbo. tablechangelog 
where tablename='table ' and id<110000)
发现只需要1~3秒即可
本来想GUID应该是造成该SQL执行的最大问题,没想到居然是网络问题
既然优化已到达效果,就暂且不用去管GUID了

后话:
对于sqlserver的执行计划以及I/O、CPU之类的指标看起来实在费劲,与其研究这些,不如靠实证来解决,呵呵

问题二
关于GUID和递增性ID带来的问题
出于唯一性和系统维护的要求,在各个表中都存在以下两个字段GUID和ID,ID一般为聚集索引+主键
[GUID] [varchar] (38) COLLATE Chinese_PRC_CI_AS NOT NULL CONSTRAINT [DF_GUID] DEFAULT ('{' + convert(char(36),newid()) + '}'),
ID  [int] IDENTITY (1, 1) NOT NULL ,

出于系统维护的要求,一般都会这样查询
select * from tableA where guid not in (select guid) from tableB)
但是GUID是不做唯一索引的,且即使加了唯一索引,考虑到GUID是无序且过于分散的,如果有几千上万的guid的话,仍是不会走索引的

关于ID,ID一般是递增的,是不要进行维护即可从数据库中获得的,同时由ado直接返回给前端程序,以便定位和显示、
INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ('Accountant',12,125)
SELECT @@IDENTITY AS 'Identity'

但是再由sqlserver2000升级到sqlserver2008后,发现返回的@@identtiy明显是错误的
后来查了一下SQLServer2000联机帮助
在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含此语句产生的最后的标识值。若此语句没有影响任何有标识列的表,则 @@IDENTITY 返回 NULL。若插入了多个行,则会产生多个标识值,@@IDENTITY 返回最后产生的标识值。如果此语句激发一个或多个执行产生标识值的插入操作的触发器,则语句执行后立即调用 @@IDENTITY 将返回由触发器产生的最后的标识值。若 INSERT 或 SELECT INTO 语句失败或大容量复制失败,或事务被回滚,则 @@IDENTITY 值不会还原为以前的设置。
发现通过
SELECT IDENT_CURRENT('tablename')能够返回正确的递增值
但是否能获取这个值,不得而知

从sqlserver2005以后系统提供了NEWSEQUENTIALID (),这个新的guid
Creates a GUID that is greater than any GUID previously generated by this function on a specified computer since Windows was started. After restarting Windows, the GUID can start again from a lower range, but is still globally unique. When a GUID column is used as a row identifier, using NEWSEQUENTIALID can be faster than using the NEWID function. This is because the NEWID function causes random activity and uses fewer cached data pages. Using NEWSEQUENTIALID also helps to completely fill the data and index pages.
这个guid是由操作系统产生的,但是每个guid都会比前一个guid要大,这即解决了唯一性问题,又解决了排序问题
目前开发人员正准备按这个思路进行修改

在指定计算机上创建大于先前通过该函数生成的任何 GUID 的 GUID。
NEWSEQUENTIALID() 不能在查询中引用。
注:即只能做为数据库列的DEFAULT VALUE,不能执行类似SELECT NEWSEQUENTIALID()的语句
只有当计算机没有网卡时,NEWSEQUENTIALID() 生成的 GUID 才在该特定计算机中是唯一的。
注:这句话是错误的,应该是只有只有当计算机有网卡时,生成的GUID才是全球唯一
您可以使用 NEWSEQUENTIALID() 生成 GUID 以减少叶级别索引上的页争用

在SQLServer处理中的一些问题及解决方法 NEWSEQUENTIALID()的更多相关文章

  1. 设置SQLServer数据库中某些表为只读的多种方法

    原文:设置SQLServer数据库中某些表为只读的多种方法 翻译自:http://www.mssqltips.com/sqlservertip/2711/different-ways-to-make- ...

  2. VS2012中丢失ArcGIS模板的解决方法

    VS2012中丢失ArcGIS模板的解决方法 由于ArcGIS10.0(for .NET)默认是用VS2010作为开发工具的,所以在先安装VS2012后装ArcGIS10.0 桌面版及ArcObjec ...

  3. js中style&period;display&equals;&quot&semi;&quot&semi;无效的解决方法

    本文实例讲述了js中style.display=""无效的解决方法.分享给大家供大家参考.具体解决方法如下: 一.问题描述: 在js中我们有时想动态的控制一个div显示或隐藏或更多 ...

  4. java开发中遇到的问题及解决方法(持续更新)

    摘自 http://blog.csdn.net/pony12/article/details/38456261 java开发中遇到的问题及解决方法(持续更新) 工作中,以C/C++开发为主,难免与其他 ...

  5. SpringBoot拦截器中无法注入bean的解决方法

    SpringBoot拦截器中无法注入bean的解决方法 在使用springboot的拦截器时,有时候希望在拦截器中注入bean方便使用 但是如果直接注入会发现无法注入而报空指针异常 解决方法: 在注册 ...

  6. asp&period;net url址址中中文汉字参数传递乱码解决方法

    中文乱码是网站开发中会常碰到的问题,今天我们来讲一下关于url址址中中文汉字参数传递乱码解决方法,有需要的朋友可以参考下.在cs文件里传参的时候用UrlEncode: Response.Redirec ...

  7. &commat;NamedEntityGraphs --JPA按实体类对象参数中的字段排序问题得解决方法

    JPA按实体类对象参数中的字段排序问题得解决方法@Entity @Table(name="complaints") @NamedEntityGraphs({ @NamedEntit ...

  8. 关于验证码在IE中不刷新的快速解决方法

    今天在做验证码的时候发现在IE中,验证码不会刷新,而谷歌等其他浏览器没有问题,所以我想到应该是缓存问题,因为IE默认的设置是如果访问地址没变化就不会去获取而是加载缓存中的内容 所以解决方案就是在验证码 ...

  9. 在启动php时,无法启动此程序&comma;由于计算机中丢失MSVCR110&period;dll的解决方法

    在启动php时,运行RunHiddenconsole.exe php-cgi.exe -b 127.0.0.1:9000 -c时,出现错误:无法启动此程序,由于计算机中丢失MSVCR110.dll 方 ...

随机推荐

  1. CentOS下Web服务器环境搭建LNMP一键安装包

    CentOS下Web服务器环境搭建LNMP一键安装包 时间:2014-09-04 00:50来源:osyunwei.com 作者:osyunwei.com 举报 点击:3797次 最新版本:lnmp- ...

  2. 测试Tomcat

  3. HDU 4864 &lpar;2014 Multi-University Training Contest 1 &rpar;

    考试时,想到了一个很类似的方法,但是总是差那么点,就是这么点,需要不断的努力啊!!! 题解: 基本思想是贪心. 对于价值c=500*xi+2*yi,yi最大影响100*2<500,所以就是求xi ...

  4. iOS开发~interface Builder&lpar;简称 IB&rpar; 界面构建器

    1.interface Builder 设置界面 1.1 是什么? 一个可视化的界面编辑工具软件,在xcode4之后整合到了xcode中 1.2 作用? 通过可视化的界面设置,能够少写或不写代码而完成 ...

  5. Entity Framework 学习初级篇2--ObjectContext、ObjectQuery、ObjectStateEntry、ObjectStateManager类的介绍

    本节,简单的介绍EF中的ObjectContext.ObjectQuery.ObjectStateEntry.ObjectStateManager这个几个比较重要的类,它们都位于System.Data ...

  6. Laravel渴求式加载(比较容易理解理解load与with关系)

    渴求式加载 当以属性方式访问 Eloquent关联关系的时候,关联关系数据是「懒惰式加载」的,这意味着关联关系数据直到第一次访问的时候才被加载.不过,Eloquent 还可以在查询父级模型的同时「渴求 ...

  7. linux磁盘管理 磁盘查看操作

    df查看磁盘分区使用状况 df --显示磁盘分区使用状况 'l' 仅显示本地磁盘(默认) 'a' 显示所有文件系统的磁盘使用情况,包含比如/proc/ 'h' 以1024进制计算最合适的单位显示磁盘容 ...

  8. 【CSS系列】获取实时数据做进度

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 【数据结构】bzoj1455罗马游戏

    Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以鼻 ...

  10. yum是什么&quest;&lpar;linux命令&rpar;

    一. yum是什么 yum = Yellow dog Updater, Modified 主要功能是更方便的添加/删除/更新RPM包. 它能自动解决包的倚赖性问题. 它能便于管理大量系统的更新问题 注 ...