博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在SQLServer处理中的一些问题及解决方法
阅读量:6080 次
发布时间:2019-06-20

本文共 2502 字,大约阅读时间需要 8 分钟。

一、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要大,这即解决了唯一性问题,又解决了排序问题
目前开发人员正准备按这个思路进行修改
本文转自baoqiangwang51CTO博客,原文链接:http://blog.51cto.com/baoqiangwang/353171
,如需转载请自行联系原作者
你可能感兴趣的文章
Mysql源码和二进制安装
查看>>
Hyper-V 2016 配置管理系列(Part3)
查看>>
网络结构中,我们非得有汇聚交换机么?
查看>>
我的友情链接
查看>>
linux中rsync配置
查看>>
新手IT人员,如何找到适合自己专业书籍的6个问题?
查看>>
去除JSP主机默认的8080端口
查看>>
关系型数据库之mysql-proxy实现读写分离
查看>>
EMC模拟器下载
查看>>
3月移动设备占比TOP10:苹果冠军 红米晋身第五
查看>>
阿里巴巴Java开发 之 工程规约
查看>>
我的友情链接
查看>>
我是如何在12周内由零基础成为一名程序员的——记Matt程序员快速成长之路
查看>>
windows server免安装IIS强性能LAMP+memcached
查看>>
世界杯迄今最火的一场比赛 一文看懂世界杯背后的阿里云黑科技
查看>>
罗辑思维在全链路压测方面的实践和工作笔记
查看>>
机器对外扫描,重装了系统也不行,打补丁也不行,什么原因?
查看>>
基于OpenSSL自建CA和颁发SSL证书
查看>>
vagrant+phpStorm配置xdebug
查看>>
union和union all的区别
查看>>