SQL开发技巧(二) 【转】感觉他写的很好
本文转自: http://www.cnblogs.com/marvin/p/DevelopSQLSkill_2.html
本系列文章旨在收集在开发过程中遇到的一些常用的SQL语句,然后整理归档,本系列文章基于SQLServer系列,且版本为SQLServer2005及以上……
文章系列目录
- SQL开发技巧(一)
- SQL开发技巧(二)
本文内容简介
这篇文章主要介绍以下内容:
- 快速查询表的总记录数
- 非递归查询树形结构表的所有子节点
- 清除查询缓存
- 编程中构建Where语句的小技巧
- 如何进行跨服务器的数据库查询
快速查询表的总记录数
什么,你还在用select count(*) from xxx
?难道没有园友告诉你用select count(col)
,select count(0)
或者select count(1)
性能会更好吗?
等等,你难道就只告诉我这个吗,我早知道了,就算是用了select count(0)
查询1000w的记录还是慢呐,你不会接着告诉我去升级服务器吧?
当然不是,我要告诉你的是下面的这个语句:
SELECT rows FROM sysindexes WHERE id= OBJECT_ID('rpt2014' ) AND indid< 2
无论查询多少记录数的表,都能立即返回总记录数。为什么它能够这么快,这原理其实跟Length
属性和Count()
方法一样的,自己体会啦。此外,要注意这个条件:indid< 2
。indid
为1就是最后提交之后的总记录数,其他值可能表示索引的记录或者其他,具体就自己search了吧。
非递归查询树形结构表的所有子节点
首先,普及一个概念,怎么设计表结构为树形结构的:要设计一个树形结构的表,必须包含两个必要字段: Id
,ParentId
那么树形结构的表要查询子节点是非常容易的:select * from table where ParentId=xxx
。但是,如何查询所有的子节点呢(包括子节点的子节点,递归查询)?
原来我采用的方法:
- 把所有记录查询出来,在程序中做递归查询
- 采用存储,在数据库中做递归查询
- 修改表结构,增加字段
ParentIdPath
。比如有节点3,父节点为2,而2的父节点为1。那节点3的ParentIdPath
就是:2,1.这样查询所有的子节点就可以用like操作了:select * from table where ParentIdPath like '2,%'
上面的方法都不太优美:我不希望在程序中查询、不希望增加额外的存储过程(我也随时随地能用)、不希望增加字段,那么到底该怎么办,需要问下蓝翔吗?
要解决这个问题,需要使用SQLServer中的with
关键字,相应创建一个临时表保存每次查询的记录:
WITH Tree AS (SELECT * FROM dbo .MgrObjType WHERE Id='00000000-A001-0000-0000-000000000000' UNION ALL SELECT MgrObjType.* FROM dbo .MgrObjType, Tree WHERE Tree.Id= dbo.MgrObjType .ParentId ) SELECT * FROM Tree
结果如下:
清除查询缓存
为什么要清除缓存,有一定开发经验的程序员都知道,把一条耗时的语句在SQLServer中查询,第一次可能很慢,第二次就很快了。这样非常影响测试的效率,甚至有些程序员竟然认为第二次查询跟第一次查询不一样,这是一种不可靠的测试,没法重现问题,把责任归咎于SQLServer,巨硬那是真真正正的躺枪。
其实,上述问题的产生,主要是因为SQLServer每次查询,都会把结果缓存下来,遇到相同的SQL语句或者类似的,会从已有的缓存中查询,缓存中不存在的,才实际访问数据库。到底内存缓存多少,你可以设置:
没错,就是它了。有经验的同学还会发现,如果你不设置,可能会耗光你的内存。记得有次我在一台128G内存的电脑上使用,没有限制,内存直接利用到了70多G,搞得运维的同学如临大敌,好像我们的软件有什么天大的问题似的!
这个语句是这么写的:
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
编程中构建Where语句的小技巧
这真是一个小技巧,我记得我最先学编程的时候,判断条件是这么判断的:
var sql=new StringBuilder();
if(age.HasValue||nickName.HasValue){sql.AppendFormat(" where ");
}
if(age.HasValue){ sql.AppendFormat("Age={0}",age.Value); } if(nickName.HasValue)……
如果条件多了的话,写得那是更加的痛苦
其实上面的条件完全可以这么写:
var sql=new StringBuilder(" where 1=1");
if(age.HasValue){sql.AppendFormat("Age={0}",age.Value); } if(nickName.HasValue)……
多了一个1=1,少了多少的条件判断。为什么会酱紫?拜托自己动一下脑筋好不,什么都要我说出来,你给我发薪水啊!
如何进行跨服务器的数据库查询
要查询另外一个数据库的表,好的,不就是DatabaseName.dbo.Table
吗,这个简单
神马,这个数据库在另外一个服务器,尼玛啊,这是什么需求,你tmd为什么要访问另外一个数据库啊。能在代码中实现吗?不行!!!???
好吧,那我们怎么实现,请看:
SELECT * FROM
OPENDATASOURCE('SQLOLEDB' , 'Data Source=172.18.24.245;User ID=sa;Password=aaa*'). CenterObj_xx.dbo .TableLog AS A
你真的没看错,只需增加这么一句OPENDATASOURCE('SQLOLEDB' , 'Data Source=172.18.24.245;User ID=sa;Password=aaa*')
即可。这句就是帮你访问远程数据库的。
转载于:https://www.cnblogs.com/TF12138/p/4103428.html
SQL开发技巧(二) 【转】感觉他写的很好相关推荐
- Cardboard虚拟现实开发技巧(二)之保持手机常亮
Google Cardboard 虚拟现实眼镜开发技巧(二)之保持手机常亮 快速解决Android与Ios平台的屏幕常亮问题 大家知道我们使用Google的Cardboard为基础去开发虚拟现实应用, ...
- SQL开发技巧 join从句
SQL标准中 join的类型 1.内连接 (INNER) 2.全外连接(FULL OUTER) JOIN 3.左外连接(LEFT OUTER) 4.右外连接 (RIGHT OUTER) 5.交叉连接 ...
- discuz二次开发技巧
discuz二次开发技巧 二次开发大多时候知识设置和处理,如果能够获知模板文件获得的变量数组将大大提高我们的开发效率 获取页面已经定义的变量 <--{eval printf_r(get_defi ...
- Android开发技巧——自定义控件之自定义属性
Android开发技巧--自定义控件之自定义属性 掌握自定义控件是很重要的,因为通过自定义控件,能够:解决UI问题,优化布局性能,简化布局代码. 上一篇讲了如何通过xml把几个控件组织起来,并继承某个 ...
- 解密android日志xlog,安卓开发技巧2:自定义日志工具类XLog的实现
安卓开发技巧二:自定义日志工具类XLog的实现 我们在开发过程中,打印日志是必不可少的一个调试环节,然而,直接使用系统自带的Log日志类,并不能满足我们实际项目的需求:假如我们现在在开发一款比较大的项 ...
- android开发技巧杂谈
android开发技巧一 android的一些常用包是发布在国外的,所以一些包,我们下载不下来,我们可以使用阿里云的镜像地址(maven { url 'https://maven.aliyun.com ...
- 【SQL开发实战技巧】系列(二):简单单表查询
系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...
- 【SQL开发实战技巧】系列(十二):三问(如何对字符串字母去重后按字母顺序排列字符串?如何识别哪些字符串中包含数字?如何将分隔数据转换为多值IN列表?)
系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...
- 【SQL开发实战技巧】系列(二十一):数据仓库中时间类型操作(进阶)识别重叠的日期范围,按指定10分钟时间间隔汇总数据
系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...
最新文章
- 探索“小数”在计算机中的存储
- 如何用知识图谱挖掘商业数据背后的宝藏?
- python3 字符串总结
- uva 10161 Ant on a Chessboard 蛇形矩阵 简单数学题
- 个人学习进度(第十三周)
- Spring Boot——基于spring-boot-starter-mail发送邮件的 Service 服务类DEMO
- 施密特触发器(Schmitt Trigger)?
- java入门从哪下手_java新手0基础如何最快速的入门
- Spring Cloud微服务之搭建service_user模块(三)
- python 安装容易吗,Python安装的步骤操作其实是件很容易的事
- 大数据Hadoop简介
- coreldrawx4缩略图显示不出来_CDR不显示缩略图的3种终极解决办法!
- 太阳能充电板给锂电池充电电路设计
- Vue/vant——使用阿里巴巴矢量图引入图标
- 知识图谱构建(概念,工具,实例调研)
- 误差函数拟合优缺点_各大厂商CTR广告预估模型的优缺点对比
- 【阅读】《乔布斯的魔力演讲》
- 在office中插入特殊符号方框带√
- iOS 获取手机IP 地址
- 初学DSP(1)-TMS320F280049C入门
热门文章
- d3d9 抓取windows屏幕
- python爬取b站评论_学习笔记(1):写了个python爬取B站视频评论的程序
- Golang实践录:xorm使用记录
- 【Elasticsearch】官方Elasticsearch Java客户端的状态
- 60-100-020-使用-MySQL 的Show Profile命令
- [Flink] Flink运行报错The number of requested virtual cores for application master
- 【正则表达式】sql语句去掉注释代码
- FastDFS 入门简介
- 03-postgresql报错ERROR: operator does not exist: numeric = character varyin
- ajax中html的属性,jQuery Ajax加载html数据正常,但属性似乎'不可读'