我发现,在具有适当索引的索引视图上,MAX(日期)执行整个索引扫描,然后执行流聚合,而TOP(1)日期最佳地使用索引并且仅扫描单个行.对于大量行,这会导致严重的性能问题.我已经包含了一些代码来演示下面的问题,但有兴趣知道其他人是否可以解释为什么会发生这种行为(它不会出现在具有类似索引的表上)以及它是否是SQL Server优化器中的错误(I已经在2008 SP2和R2上进行了测试,两者都显示了相同的问题).
CREATE TABLE dbo.TableWithDate
(
id INT IDENTITY(1,1) PRIMARY KEY,
theDate DATE NOT NULL
);
CREATE NONCLUSTERED INDEX [ix_date] ON dbo.TableWithDate([theDate] DESC);
INSERT INTO dbo.TableWithDate(theDate) VALUES('1 MAR 2010'),('1 MAR 2010'), ('3 JUN 2008');
-- Test 1: max vs top(1) on the table. They give same optimal plan (scan one row from the index, since index is in order)
SELECT TOP(1) theDate FROM dbo.TableWithDate ORDER BY theDate DESC;
SELECT MAX(theDate) FROM dbo.TableWithDate;
CREATE TABLE dbo.TheJoinTable
(
identId INT IDENTITY(1,1) …Run Code Online (Sandbox Code Playgroud) 我用它创建了一个视图CREATE VIEW dbo.myView AS SELECT * FROM dbo.myTable.myView我添加列时不会选择新列dbo.myTable.有没有办法让我的视图选中表中的所有列,即使我添加列而不必更新视图?