SqlServer 2005 T-SQL Query 学习笔记(4)

2016-02-19 10:19 10 1 收藏

下面,图老师小编带您去了解一下SqlServer 2005 T-SQL Query 学习笔记(4),生活就是不断的发现新事物,get新技能~

【 tulaoshi.com - 编程语言 】

比如,我要建立一个1,000,000行的数字表:

CREATE TABLE dbo.Nums(n INT NOT NULL PRIMARY KEY);
DECLARE @max AS INT, @rc AS INT;
SET @max = 1000000;
SET @rc = 1;

INSERT INTO Nums VALUES(1);
WHILE @rc * 2 = @max
BEGIN
INSERT INTO dbo.Nums SELECT n + @rc FROM dbo.Nums;
SET @rc = @rc * 2;
END

INSERT INTO dbo.Nums
SELECT n + @rc FROM dbo.Nums WHERE n + @rc = @max;




这种方式非常巧妙,它并不是一个一个的循环插入,而是一次插入很多行,{1},{2},{3,4},{5,6,7,8}。。。



为什么这样会快呢?

是因为它节省了跟比较其他可用解决方案进行比较和记录这些日志的时间。



然后,作者给了一个CTE的递归的解决方案:

DECLARE @n AS BIGINT;
SET @n = 1000000;

WITH Nums AS
(
SELECT 1 AS n
UNION ALL
SELECT n + 1 FROM Nums WHERE n @n
)
SELECT n FROM Nums
OPTION(MAXRECURSION 0);--为了移除默认100的递归限制


有个更优的CTE的解决方案,就是先生成很多行,然后用ROW_NUMBER进行计算,再选择ROW_NUMBER这列的值就可以了。

代码如下:

DECLARE @n AS BIGINT;
SET @n = 1000000;

WITH Base AS
(
SELECT 1 AS n
UNION ALL
SELECT n + 1 FROM Base WHERE n CEILING(SQRT(@n))
),
Expand AS
(
SELECT 1 AS c
FROM Base AS B1, Base AS B2
),
Nums AS
(
SELECT ROW_NUMBER() OVER(ORDER BY c) AS n
FROM Expand
)
SELECT n FROM Nums WHERE n = @n
OPTION(MAXRECURSION 0);


利用笛卡尔积进行不断的累加,达到了22n行。

最后,作者给出了一个函数,用于生成这样的数字表:
代码如下:

CREATE FUNCTION dbo.fn_nums(@n AS BIGINT) RETURNS TABLE
AS
RETURN
WITH
L0 AS(SELECT 1 AS c UNION ALL SELECT 1),
L1 AS(SELECT 1 AS c FROM L0 AS A, L0 AS B),
L2 AS(SELECT 1 AS c FROM L1 AS A, L1 AS B),
L3 AS(SELECT 1 AS c FROM L2 AS A, L2 AS B),
L4 AS(SELECT 1 AS c FROM L3 AS A, L3 AS B),
L5 AS(SELECT 1 AS c FROM L4 AS A, L4 AS B),
Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY c) AS n FROM L5)
SELECT n FROM Nums WHERE n = @n;
GO

来源:http://www.tulaoshi.com/n/20160219/1594193.html

延伸阅读
使用APPLY运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。 表值函数作为右输入,外部表表达式作为左输入。 通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出。 APPLY运算符生成的列的列表是左输入中的列集,后跟右输入返回的列的列表。 APPLY 运算符的左操作数和右操作数都是表表达式。 ...
标签: SQLServer
1. 查看数据库的版本        select @@version        常见的几种SQL SERVER打补丁后的版本号:         8.00.194   Microsoft SQL Server 2000      8.00.384&...
标签: SQLServer
1. 查看数据库的版本     select @@version     常见的几种SQL SERVER打补丁后的版本号:     8.00.194   Microsoft SQL Server 2000   8.00.384   Microsoft SQL Server 2000 SP1   8.00.532   Microsoft SQL Server 2000 SP2   8.00.760   Microsoft SQL Server 200...
CTE是Common Table Expression的简写,翻译成中文就是通用表表达式,它可以在select,insert或者update中使用。 为了说明问题,我们先随便建张表,插入几条数据: if object_id('t','U') is not null --用object_id函数判断表是否在数据库中存在很简洁 drop table t; GO create table t(c1 int,c2 decimal,c3 ...
首先需要说明的是这篇文章的内容并不是如何调节SQL Server查询性能的(有关这方面的内容能写一本书),而是如何在SQL Server查询性能的调节中利用SET STATISTICS IO和SET STATISTICS TIME这二条被经常忽略的Transact-SQL命令的。 从表面上看,查询性能的调节是一件十分简单的事。从本质上讲,我们希望查询的运行速度能够尽可能地快,...

经验教程

267

收藏

49
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部