我需要从几个日志表中创建统计信息。每小时大部分时间,但有时每5分钟更频繁一次。先选择行,然后按日期时间 - 有没有子查询?
选择行只有datetime
不是更大的日志速度不够快,所以我想我只选择通过存储最大Id
,下次再使用它是自上次查询新行:
SELECT TOP(1000) * -- so that it's not too much
FROM [dbo].[Log]
WHERE Id > lastId AND [Timestamp] >= timestampMin
ORDER BY [Id] DESC
我的问题:在SQL Server足够聪明到:
- 第一滤波器由行10,然后是
Timestamp
,即使我更改条件的顺序或条件顺序是否重要,或者 - 是否需要子查询先按
Id
选择行,然后再通过Timestamp
筛选它们。
与子查询:
SELECT *
FROM (
SELECT TOP(1000) * FROM [dbo].[Log]
WHERE Id > lastId
ORDER BY [Id] DESC
) t
WHERE t.[TimeStamp] >= timestampMin
表架构是:
CREATE TABLE [dbo].[Log](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Timestamp] [datetime2](7) NOT NULL,
-- other columns
CONSTRAINT [PK_dbo_Log] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
我试图使用查询计划,以找出它是如何工作的,但事实证明我无法阅读,但我不明白。
条件的顺序并不重要,引擎会列出使用它们的最佳方式。你的子查询返回的结果与原来的结果不同,原因在于你里面的“TOP 1000”。那是你要的吗?我认为'TOP 1000'应该在外部查询中。 – NickyvV
大多数情况下,如果您问:“SQL Server足够聪明......”答案通常是肯定的。 – Tanner
@NickyvV现在你提到了'TOP 1000'我认为你是对的。如果我把它放在内部查询中,结果可能会不同。 – t3chb0t