SQL的count快速查询表的总记录数
作者:本站编辑
发布时间:2024-10-02
来源:本站原创
点击数:
快速查询表的总记录数
什么,你还在用select count(*) from xxx?难道没有园友告诉你用select count(col),select count(0)或者select count(1)性能会更好吗?
等等,你难道就只告诉我这个吗,我早知道了,就算是用了select count(0)查询1000w的记录还是慢呐,你不会接着告诉我去升级服务器吧?
当然不是,我要告诉你的是下面的这个语句:
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.
WITH Tree AS (
2.
SELECT * FROM dbo .MgrObjType WHERE Id='00000000-A001-0000-0000-000000000000'
3.
UNION ALL
4.
SELECT MgrObjType.* FROM dbo .MgrObjType, Tree WHERE Tree.Id= dbo.MgrObjType .ParentId
5.
)
6.
SELECT * FROM Tree
结果如下: