例如,视图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字段上这个索引吗?不明白为什么
也就是说,sql server 不会自动去走pid字段上这个索引吗?不明白为什么
#4
是的,那个索引是用在表上的,而不是建立在视图上,所以要在此视图建立索引
#5
和查询条件有关的,系统会主动处理的,
#6
楼主有测试过吗????测试了再说,索引没楼主想的那么简单
#7
是因为想起之前的应用遇到了这个问题,所临时发帖先了解下,现在身边没有环境测试。
#9
SQL77 老兄,要么先你帮我测下?呵呵
#10
要真实环境最好:
你的查询能不能走索引主要因素是你的表索引结构,表数据量,最重要的是你查询时的参数
#11
你说的,都懂的。
就这例子,测试下。SQL2005
就这例子,测试下。SQL2005
#12
结果:可能走,可能不走
#13
那就是说,视图查询,可以走基表上的索引?是这个结论么
#14
优化器会自行处理, 通常情况下都会走索引。
a表上的id与pid是单独索引还是复合索引,影响连接算法。
a表上的id与pid是单独索引还是复合索引,影响连接算法。
#15
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
sql os处理时依然会检查基础对象(依赖项),优化器也是基于依赖项进行优化。
#17
应该是能够用到id 和pid 的索引的
但是优化器会选择是否使用索引。
但是优化器会选择是否使用索引。
#1
#2
直接创建索引视图
#3
谢谢楼上两位。
也就是说,sql server 不会自动去走pid字段上这个索引吗?不明白为什么
也就是说,sql server 不会自动去走pid字段上这个索引吗?不明白为什么
#4
是的,那个索引是用在表上的,而不是建立在视图上,所以要在此视图建立索引
#5
和查询条件有关的,系统会主动处理的,
#6
楼主有测试过吗????测试了再说,索引没楼主想的那么简单
#7
是因为想起之前的应用遇到了这个问题,所临时发帖先了解下,现在身边没有环境测试。
#8
你可以创建视图索引。
T-SQL索引视图
#9
SQL77 老兄,要么先你帮我测下?呵呵
#10
要真实环境最好:
你的查询能不能走索引主要因素是你的表索引结构,表数据量,最重要的是你查询时的参数
#11
你说的,都懂的。
就这例子,测试下。SQL2005
就这例子,测试下。SQL2005
#12
结果:可能走,可能不走
#13
那就是说,视图查询,可以走基表上的索引?是这个结论么
#14
优化器会自行处理, 通常情况下都会走索引。
a表上的id与pid是单独索引还是复合索引,影响连接算法。
a表上的id与pid是单独索引还是复合索引,影响连接算法。
#15
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
sql os处理时依然会检查基础对象(依赖项),优化器也是基于依赖项进行优化。
#17
应该是能够用到id 和pid 的索引的
但是优化器会选择是否使用索引。
但是优化器会选择是否使用索引。