我读到派生表比临时表具有更好的性能,但无论如何许多 SQL Server 开发人员更喜欢第二个。为什么?我必须对大数据(数百万条记录)进行查询,并且我想确保我使用的是最佳选择。
CREATE TABLE A(
id BIGINT IDENTITY(1,1) NOT NULL,
field1 INT NOT NULL,
field2 VARCHAR(50) NULL,
);
CREATE TABLE B(
id INT IDENTITY(1,1) NOT NULL,
field1 VARCHAR(10) NULL,
field2 INT NULL
);
INSERT INTO A
(field1,field2)
VALUES
(1,'a'),(2,'b'),(3,'c'),(2,'d'),(5,'e'),
(6,'f'),(7,'g'),(8,'h'),(9,'i'),(2,'j');
INSERT INTO B
(field1,field2)
VALUES
('a',1),('b',2),('c',3),('d',4),('e',5),
('f',6),('g',7),('h',8),('i',9),('j',2),('k',3);
DECLARE @begin INT=0,@end INT=200;
Run Code Online (Sandbox Code Playgroud)
派生表
/*derived tables*/
SELECT
C.id,C.field1,C.field2,C.field3
FROM
(
SELECT
A.id,A.field1,A.field2,B.field2 AS field3,
ROW_NUMBER() OVER (ORDER BY A.id) AS iRow
FROM
A INNER JOIN B ON A.field1=B.id
) C …Run Code Online (Sandbox Code Playgroud) performance sql-server-2008 sql-server derived-tables temporary-tables query-performance
我有一个数据表:
ID Action Date
1 Action1 2014-01-20
2 Action1 2014-01-22
3 Action1 2014-01-28
4 Action2 2014-01-20
5 Action2 2014-01-22
6 Action2 2014-01-28
Run Code Online (Sandbox Code Playgroud)
我需要按日期分组,以 3 天的差异分组:
Action Count
Action1 2
Action2 2
Run Code Online (Sandbox Code Playgroud)
如果一条记录与以前的记录分组,则它不会在另一个组中:
ID Action Date
1 Action1 2014-01-20
2 Action1 2014-01-23
3 Action1 2014-01-24
Action Count
Action1 2
Run Code Online (Sandbox Code Playgroud)
我的解决方案:
SELECT T1.Action, DATEDIFF(DAY,T1.Date,T2.Date) as Count
FROM Table T1
JOIN Table T2 ON T1.Action=T2.Action
WHERE DATEDIFF(DAY,T1.Date,T2.Date) BETWEEN 1 AND 3
GROUP BY T1.Action,T1.Date,T2.Date
Run Code Online (Sandbox Code Playgroud)
这是正确的解决方案吗?