逐浪云主机

立即开通

SQL的count快速查询表的总记录数

作者:本站编辑 发布时间:2024-10-02 来源:本站原创 点击数:

快速查询表的总记录数
什么,你还在用select count(*) from xxx?难道没有园友告诉你用select count(col),select count(0)或者select count(1)性能会更好吗?

等等,你难道就只告诉我这个吗,我早知道了,就算是用了select count(0)查询1000w的记录还是慢呐,你不会接着告诉我去升级服务器吧?

当然不是,我要告诉你的是下面的这个语句:

  1. 1.
    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关键字,相应创建一个临时表保存每次查询的记录:

  1. 1.
    WITH Tree AS (
  2. 2.
    SELECT * FROM dbo .MgrObjType WHERE Id='00000000-A001-0000-0000-000000000000'
  3. 3.
    UNION ALL
  4. 4.
    SELECT MgrObjType.* FROM dbo .MgrObjType, Tree WHERE Tree.Id= dbo.MgrObjType .ParentId
  5. 5.
    )
  6. 6.
    SELECT * FROM Tree

结果如下:
在这里插入图片描述

本文责任编辑: 加入会员收藏夹 点此参与评论>>
复制本网址-发给QQ/微信上的朋友