在 sqlserver 2008 和 2012 上测试:
问题N 3中的第一种方法:
CREATE TABLE #t (n INT)
;WITH N1 (N) AS
(SELECT 1 FROM (VALUES (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1)) n (N)),
N2 (N) AS (SELECT 1 FROM N1 AS N1 CROSS JOIN N1 AS N2),
N3 (N) AS (SELECT 1 FROM N2 AS N1 CROSS JOIN N2 AS N2),
N4 (N) AS (SELECT ROW_NUMBER() OVER(ORDER BY N1.N) FROM N3 AS N1 CROSS JOIN N3 AS N2),
N5 (N) AS (SELECT top 50000000 N%4 + 1 N FROM n4)
INSERT #t
SELECT n from n5
DECLARE @dummy int
DECLARE @a datetime = getdate()
SELECT @dummy = count(*)
FROM #t
WHERE N <> 3
SELECT datediff(ms, 0, getdate() - @a)
结果:
3886 milliseconds
问题的第二种方法
CREATE TABLE #t (n INT)
;WITH N1 (N) AS
(SELECT 1 FROM (VALUES (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1)) n (N)),
N2 (N) AS (SELECT 1 FROM N1 AS N1 CROSS JOIN N1 AS N2),
N3 (N) AS (SELECT 1 FROM N2 AS N1 CROSS JOIN N2 AS N2),
N4 (N) AS (SELECT ROW_NUMBER() OVER(ORDER BY N1.N) FROM N3 AS N1 CROSS JOIN N3 AS N2),
N5 (N) AS (SELECT top 50000000 N%4 + 1 N FROM n4)
INSERT #t
SELECT n from n5
DECLARE @dummy int
DECLARE @a datetime = getdate()
SELECT @dummy = count(*)
FROM #t
WHERE N in (1,2,4)
SELECT datediff(ms, 0, getdate() - @a)
结果:
4223 milliseconds
结论
N 3 更快(3886 vs 4223 毫秒)
是的,这似乎是一个很小的差异,但如果该列被声明为 varchar(10) - CREATE TABLE #t (n INT) - 差异会更显着(经过测试)。