SQL Fiddle:http ://sqlfiddle.com/#!6/d4496/ 1(为您的实验预先生成数据)
有明显的表:
CREATE TABLE Entity
(
ID int,
Classificator1ID int,
Classificator2ID int,
Classificator3ID int,
Classificator4ID int,
Classificator5ID int
);
和观点:
CREATE VIEW dbo.EntityView (ID, Code1, Code2, Code3, Code4, Code5)
WITH SCHEMABINDING
其中实体字段 Classificator1ID..Classificator5ID 解析为分类器值 Code1..Code5
这个视图上有很多索引:
CREATE UNIQUE CLUSTERED INDEX [IXUC_EntityView$ID] ON EntityView
([ID]);
CREATE UNIQUE NONCLUSTERED INDEX [IXU_EntityView$ID$include$ALL] ON EntityView
([ID]) INCLUDE (Code1, Code2, Code3, Code4, Code5);
CREATE UNIQUE NONCLUSTERED INDEX [IXU_EntityView$ALL] ON EntityView
([ID],Code1, Code2, Code3, Code4, Code5);
CREATE UNIQUE NONCLUSTERED INDEX [IXU_EntityView$ID$Code1] ON EntityView
([ID],Code1);
CREATE UNIQUE NONCLUSTERED INDEX [IXU_EntityView$ID$include$Code1] ON EntityView
([ID])INCLUDE (Code1);
CREATE NONCLUSTERED INDEX [IX_EntityView$Code1] ON EntityView
(Code1);
CREATE NONCLUSTERED INDEX [IX_EntityView$Code1$include$ID] ON EntityView
(Code1) INCLUDE (ID);
但 QO 从不使用它们!尝试这个:
SELECT * FROM EntityView;
SELECT ID, Code1 FROM EntityView;
SELECT ID, Code1, Code2, Code3, Code4, Code5 FROM EntityView;
SELECT ID, Code1, Code2, Code3, Code4, Code5 FROM EntityView WHERE ID=1;
SELECT ID, Code1 FROM EntityView Where Code1 like 'NR%';
为什么?尤其是“包含”索引有什么问题?已创建索引,具有所有字段但仍未使用...
补充:这只是测试!请不要这么生气,也不要逼我分析那些索引维护问题。
在我的真实项目中,我无法解释为什么 QO 会忽略索引视图(非常有用的索引视图)。但有时我看到它在其他地方使用它们。我创建了这个 db 片段来试验索引公式,但可能我应该做更多的事情:以某种方式调整 statistcs 吗?