本系列文章旨在收集在开发过程中遇到的一些常用的SQL语句,然后整理归档,本系列文章基于SQLServer系列,且版本为SQLServer2005及以上……

文章系列目录

  1. SQL开发技巧(一)
  2. 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< 2indid为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*')即可。这句就是帮你访问远程数据库的。

往期内容回顾

1.SQL开发技巧(一)

  • 使用Row_Number分页
  • 事务
  • 根据条件刷选记录的技巧

SQL开发技巧(二)的更多相关文章

  1. SQL开发技巧(二) 【转】感觉他写的很好

    本文转自: http://www.cnblogs.com/marvin/p/DevelopSQLSkill_2.html 本系列文章旨在收集在开发过程中遇到的一些常用的SQL语句,然后整理归档,本系列 ...

  2. Sql开发技巧

    原文:Sql开发技巧 简介 本文主要介绍下述几个技巧: 使用Row_Number分页 事务 根据条件刷选记录的技巧 分页 主要是使用了Row_Number()这个函数.一般如下: declare @P ...

  3. Mysql - 开发技巧(二)

    本文中的涉及到的表在https://github.com/YangBaohust/my_sql中 本文衔接Mysql - 巧用join来优化sql(https://www.cnblogs.com/dd ...

  4. sql开发技巧总结-2

    ---恢复内容开始--- 1.如何进行行列转换 需求: 列转换成行 select a.`user_name`,sum(b.kills) from user1 a join user_kills b o ...

  5. sql开发技巧总结-1

    1.数据库分类 关系型 非关系型 2.sql语句分类 sql: ddl数据库定义语言  tpl事物处理语言 dcl数据控制语言  dml数据操作语言(insert delete update sele ...

  6. CSS开发技巧(二):表格合并边框后的单元格宽度计算

    前言: 分离边框模型和合并边框模型是表格的两种模型,它通过以下属性确定: border-collapse:separate(默认值) | collapse | inherit 当采用分离边框模型时,表 ...

  7. discuz二次开发技巧

    discuz二次开发技巧 二次开发大多时候知识设置和处理,如果能够获知模板文件获得的变量数组将大大提高我们的开发效率 获取页面已经定义的变量 <--{eval printf_r(get_defi ...

  8. SQL开发中容易忽视的一些小地方(二)

    原文:SQL开发中容易忽视的一些小地方(二) 目的:继上一篇:SQL开发中容易忽视的一些小地方(一) 总结SQL中的null用法后,本文我将说说表联接查询. 为了说明问题,我创建了两个表,分别是学生信 ...

  9. AngularJS进阶(二十九)AngularJS项目开发技巧之localStorage存储

    AngularJS项目开发技巧之localStorage存储       注: localStorage深度学习 绪 项目开发完毕,测试阶段发现后台管理端二维码生成有问题,问题在于localStora ...

随机推荐

  1. C++ 可配置的类工厂

    项目中常用到工厂模式,工厂模式可以把创建对象的具体细节封装到Create函数中,减少重复代码,增强可读和可维护性.传统的工厂实现如下: class Widget { public: virtual i ...

  2. setAttribute()

    ●节点分为不同的类型:元素节点.属性节点和文本节点等.   ●getElementById()方法将返回一个对象,该对象对应着文档里的一个特定的元素节点.   ●getElementsByTagNam ...

  3. 菜鸟学Struts2——零配置(Convention )

    又是周末,继续Struts2的学习,之前学习了,Struts的原理,Actions以及Results,今天对对Struts的Convention Plugin进行学习,如下图: Struts Conv ...

  4. potrace源码分析一

    1 简介 potrace是由Dalhousie University的Peter Selinger开发一款位图轮廓矢量化软件,该软件源码是可以公开下载的,详细见项目主页:http://potrace. ...

  5. .Net语言 APP开发平台——Smobiler学习日志:如何快速在手机上实现ContextMenu

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 样式一 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的&qu ...

  6. 通过sails和阿里大于实现短信验证

    通过sails与阿里大于来实现注册短信验证码的发送,逻辑图如下 1.用户在客户端发送手机号给服务器,服务器接收到手机号,生成对应时间戳,随机四位数验证码 2.服务器将电话号码和验证码告诉阿里大于服务器 ...

  7. 港真,到底应该选择OA还是BPM?

    越来越多企业意识到流程管理的重要性,但是,选择OA还是BPM,却让他们产生了选择困难症. 一方面,企业皆注重流程的高效运转,最好内外部的业务都能用一个系统来解决.所有流程一天就能上线什么的,那就更好啦 ...

  8. Atitit 软件工程概览attilax总结

    Atitit 软件工程概览attilax总结 1.1. .2 软件工程的发展 进一步地,结合人类发展史和计算机世界演化史来考察软件工程的发展史. 表2 软件工程过程模型 表2将软件工程的主要过程模型做 ...

  9. 邻接矩阵的深度优先遍历(java版)

    这是一个有向边带权的图 顶点数组:[v0, v1, v2, v3, v4] 边数组: v0 v1 v2 v3 v4 v0 6 v1 9 3 v2 2 5 v3 1 v4 package com.dat ...

  10. 【腾讯Bugly干货分享】WebVR如此近-three.js的WebVR示例解析

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57c7ff1689a6c9121b1adb16 作者:苏晏烨 关于WebVR 最 ...