【发布时间】:2015-02-06 05:22:48
【问题描述】:
我试图从 Stackoverflow 线程中理解这个查询:
--create test table
CREATE TABLE dbo.TestTable(
Col1 nchar(4000) NOT NULL
, Col2 nvarchar(MAX) NOT NULL
);
--load 10000 rows (about 2.8GB)
WITH
t4 AS (SELECT n FROM (VALUES(0),(0),(0),(0)) t(n))
,t256 AS (SELECT 0 AS n FROM t4 AS a CROSS JOIN t4 AS b CROSS JOIN t4 AS c CROSS JOIN t4 AS d)
,t16M AS (SELECT ROW_NUMBER() OVER (ORDER BY (a.n)) AS num FROM t256 AS a CROSS JOIN t256 AS b CROSS JOIN t256 AS c)
INSERT INTO dbo.TestTable WITH(TABLOCKX) (Col1, Col2)
SELECT REPLICATE(N'X', 4000), REPLICATE(CAST('X' AS nvarchar(MAX)), 10000)
FROM t16M
WHERE num <= 100000;
GO
--run query in loop (expect parallel execution plan with many read-ahead and LOB page reads)
SET NOCOUNT ON;
DECLARE @RowCount int, @Iteration int = 1;
WHILE @Iteration <= 100
BEGIN
CHECKPOINT;
DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;
SELECT @RowCount = COUNT(*) FROM dbo.TestTable WHERE Col2 LIKE 'X%';
RAISERROR('Iteration %d completed',0,1,@Iteration) WITH NOWAIT; --display progress message
SET @Iteration += 1;
END;
GO
-
我特别无法理解 t-sql 查询的这一部分:
--load 10000 rows (about 2.8GB) WITH t4 AS (SELECT n FROM (VALUES(0),(0),(0),(0)) t(n)) ,t256 AS (SELECT 0 AS n FROM t4 AS a CROSS JOIN t4 AS b CROSS JOIN t4 AS c CROSS JOIN t4 AS d) ,t16M AS (SELECT ROW_NUMBER() OVER (ORDER BY (a.n)) AS num FROM t256 AS a CROSS JOIN t256 AS b CROSS JOIN t256 AS c) INSERT INTO dbo.TestTable WITH(TABLOCKX) (Col1, Col2) SELECT REPLICATE(N'X', 4000), REPLICATE(CAST('X' AS nvarchar(MAX)), 10000) FROM t16M WHERE num <= 100000; GO 为什么我们在“--load 10000rows...”下面有一个“With”;那个“with”是做什么的?它是“创建”语句的一部分吗?
-
关于这个插入语句:
INSERT INTO dbo.TestTable WITH(TABLOCKX) (Col1, Col2) SELECT REPLICATE(N'X', 4000), REPLICATE(CAST('X' AS nvarchar(MAX)), 10000) FROM t16M WHERE num <= 100000;不只是
INSERT INTO dbo.TestTable WITH(TABLOCKX) (Col1, Col2) FROM t16M WHERE num <= 100000;做吗?以上不是从 t16M 中取出前 10000 行并插入到 dbo.TestTable 中吗?我们为什么要这样做“选择...”?这意味着什么? 我知道
REPLICATE(N'X', 4000)会将X4000 次放入Col1,REPLICATE(CAST('X' AS nvarchar(MAX)), 10000)将X放入Col210000 次。如果我们这样做,那么为什么要从 t16M 中选择呢?或者如果我们从 t16M 中选择,那为什么要复制呢? 做什么 @RowCount = 计数(*) 做?将表中的行数分配给名为“RowCount”的变量?它与“@@RowCount”相同吗?我认为不可能。
【问题讨论】:
标签: sql-server tsql