通过视图去查询,能用到索引吗

时间:2021-07-02 16:04:43
各位好。

例如,视图v_tt的大致定义如下:
select a.id,a.name,a.pid,b.id,b.name from a,b where a.id = b.id

id,pid上均有索引。

我要做下面这样的查询,是否能用到pid的索引?如果不行,应如何做(视图结构不能修改)。
select * from v_tt where pid = xxx;

谢谢!


17 个解决方案

#2


直接创建索引视图

#3


谢谢楼上两位。

也就是说,sql server 不会自动去走pid字段上这个索引吗?不明白为什么

#4


引用 3 楼 sleepzzzzz 的回复:
谢谢楼上两位。

也就是说,sql server 不会自动去走pid字段上这个索引吗?不明白为什么

是的,那个索引是用在表上的,而不是建立在视图上,所以要在此视图建立索引

#5


和查询条件有关的,系统会主动处理的,

#6


引用 3 楼 sleepzzzzz 的回复:
谢谢楼上两位。

也就是说,sql server 不会自动去走pid字段上这个索引吗?不明白为什么

楼主有测试过吗????测试了再说,索引没楼主想的那么简单

#7


是因为想起之前的应用遇到了这个问题,所临时发帖先了解下,现在身边没有环境测试。

引用 6 楼 sql77 的回复:
引用 3 楼 sleepzzzzz 的回复:
谢谢楼上两位。

也就是说,sql server 不会自动去走pid字段上这个索引吗?不明白为什么

楼主有测试过吗????测试了再说,索引没楼主想的那么简单

#8


你可以创建视图索引。 T-SQL索引视图

#9


SQL77 老兄,要么先你帮我测下?呵呵

#10


引用 9 楼 sleepzzzzz 的回复:
SQL77 老兄,要么先你帮我测下?呵呵

要真实环境最好:
你的查询能不能走索引主要因素是你的表索引结构,表数据量,最重要的是你查询时的参数

#11


你说的,都懂的。

就这例子,测试下。SQL2005

#12


引用 11 楼 sleepzzzzz 的回复:
你说的,都懂的。

就这例子,测试下。SQL2005

结果:可能走,可能不走

#13


那就是说,视图查询,可以走基表上的索引?是这个结论么

引用 12 楼 sql77 的回复:
引用 11 楼 sleepzzzzz 的回复:
你说的,都懂的。

就这例子,测试下。SQL2005

结果:可能走,可能不走

#14


优化器会自行处理, 通常情况下都会走索引。

a表上的id与pid是单独索引还是复合索引,影响连接算法。

#15


引用 13 楼 sleepzzzzz 的回复:
那就是说,视图查询,可以走基表上的索引?是这个结论么


引用 12 楼 sql77 的回复:
引用 11 楼 sleepzzzzz 的回复:
你说的,都懂的。

就这例子,测试下。SQL2005

结果:可能走,可能不走




CREATE TABLE TB (ID INT PRIMARY KEY NOT NULL)
GO
INSERT TB SELECT 1 
GO
CREATE VIEW V
AS
SELECT * FROM TB
GO
SET SHOWPLAN_TEXT ON
GO
SELECT * FROM V WHERE ID=1

/*StmtText                
----------------------- 
SET SHOWPLAN_TEXT ON

(所影响的行数为 1 行)

StmtText                      
----------------------------- 
SELECT * FROM V WHERE ID=1

(所影响的行数为 1 行)

StmtText                                                                                                                  
------------------------------------------------------------------------------------------------------------------------- 
  |--Clustered Index Seek(OBJECT:([dbdb].[dbo].[TB].[PK__TB__5008A86A]), SEEK:([TB].[ID]=Convert([@1])) ORDERED FORWARD)

(所影响的行数为 1 行)

#16


引用 13 楼 sleepzzzzz 的回复:
那就是说,视图查询,可以走基表上的索引?是这个结论么

引用 12 楼 sql77 的回复:
引用 11 楼 sleepzzzzz 的回复:
你说的,都懂的。

就这例子,测试下。SQL2005

结果:可能走,可能不走


sql os处理时依然会检查基础对象(依赖项),优化器也是基于依赖项进行优化。

#17


应该是能够用到id 和pid 的索引的
但是优化器会选择是否使用索引。

#1


#2


直接创建索引视图

#3


谢谢楼上两位。

也就是说,sql server 不会自动去走pid字段上这个索引吗?不明白为什么

#4


引用 3 楼 sleepzzzzz 的回复:
谢谢楼上两位。

也就是说,sql server 不会自动去走pid字段上这个索引吗?不明白为什么

是的,那个索引是用在表上的,而不是建立在视图上,所以要在此视图建立索引

#5


和查询条件有关的,系统会主动处理的,

#6


引用 3 楼 sleepzzzzz 的回复:
谢谢楼上两位。

也就是说,sql server 不会自动去走pid字段上这个索引吗?不明白为什么

楼主有测试过吗????测试了再说,索引没楼主想的那么简单

#7


是因为想起之前的应用遇到了这个问题,所临时发帖先了解下,现在身边没有环境测试。

引用 6 楼 sql77 的回复:
引用 3 楼 sleepzzzzz 的回复:
谢谢楼上两位。

也就是说,sql server 不会自动去走pid字段上这个索引吗?不明白为什么

楼主有测试过吗????测试了再说,索引没楼主想的那么简单

#8


你可以创建视图索引。 T-SQL索引视图

#9


SQL77 老兄,要么先你帮我测下?呵呵

#10


引用 9 楼 sleepzzzzz 的回复:
SQL77 老兄,要么先你帮我测下?呵呵

要真实环境最好:
你的查询能不能走索引主要因素是你的表索引结构,表数据量,最重要的是你查询时的参数

#11


你说的,都懂的。

就这例子,测试下。SQL2005

#12


引用 11 楼 sleepzzzzz 的回复:
你说的,都懂的。

就这例子,测试下。SQL2005

结果:可能走,可能不走

#13


那就是说,视图查询,可以走基表上的索引?是这个结论么

引用 12 楼 sql77 的回复:
引用 11 楼 sleepzzzzz 的回复:
你说的,都懂的。

就这例子,测试下。SQL2005

结果:可能走,可能不走

#14


优化器会自行处理, 通常情况下都会走索引。

a表上的id与pid是单独索引还是复合索引,影响连接算法。

#15


引用 13 楼 sleepzzzzz 的回复:
那就是说,视图查询,可以走基表上的索引?是这个结论么


引用 12 楼 sql77 的回复:
引用 11 楼 sleepzzzzz 的回复:
你说的,都懂的。

就这例子,测试下。SQL2005

结果:可能走,可能不走




CREATE TABLE TB (ID INT PRIMARY KEY NOT NULL)
GO
INSERT TB SELECT 1 
GO
CREATE VIEW V
AS
SELECT * FROM TB
GO
SET SHOWPLAN_TEXT ON
GO
SELECT * FROM V WHERE ID=1

/*StmtText                
----------------------- 
SET SHOWPLAN_TEXT ON

(所影响的行数为 1 行)

StmtText                      
----------------------------- 
SELECT * FROM V WHERE ID=1

(所影响的行数为 1 行)

StmtText                                                                                                                  
------------------------------------------------------------------------------------------------------------------------- 
  |--Clustered Index Seek(OBJECT:([dbdb].[dbo].[TB].[PK__TB__5008A86A]), SEEK:([TB].[ID]=Convert([@1])) ORDERED FORWARD)

(所影响的行数为 1 行)

#16


引用 13 楼 sleepzzzzz 的回复:
那就是说,视图查询,可以走基表上的索引?是这个结论么

引用 12 楼 sql77 的回复:
引用 11 楼 sleepzzzzz 的回复:
你说的,都懂的。

就这例子,测试下。SQL2005

结果:可能走,可能不走


sql os处理时依然会检查基础对象(依赖项),优化器也是基于依赖项进行优化。

#17


应该是能够用到id 和pid 的索引的
但是优化器会选择是否使用索引。