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

sleepzzzzz 2011-06-24 12:46:16
各位好。

例如,视图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;

谢谢!


...全文
1210 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
sleepzzzzz 2011-06-24
  • 打赏
  • 举报
回复
谢谢楼上两位。

也就是说,sql server 不会自动去走pid字段上这个索引吗?不明白为什么
--小F-- 2011-06-24
  • 打赏
  • 举报
回复
直接创建索引视图
叶子 2011-06-24
  • 打赏
  • 举报
回复
黄_瓜 2011-06-24
  • 打赏
  • 举报
回复
应该是能够用到id 和pid 的索引的
但是优化器会选择是否使用索引。
fcuandy 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 sleepzzzzz 的回复:]

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

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

就这例子,测试下。SQL2005

结果:可能走,可能不走
[/Quote]

sql os处理时依然会检查基础对象(依赖项),优化器也是基于依赖项进行优化。
SQL77 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 sleepzzzzz 的回复:]
那就是说,视图查询,可以走基表上的索引?是这个结论么


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

就这例子,测试下。SQL2005

结果:可能走,可能不走
[/Quote]



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 行)
fcuandy 2011-06-24
  • 打赏
  • 举报
回复
优化器会自行处理, 通常情况下都会走索引。

a表上的id与pid是单独索引还是复合索引,影响连接算法。
sleepzzzzz 2011-06-24
  • 打赏
  • 举报
回复
那就是说,视图查询,可以走基表上的索引?是这个结论么

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

就这例子,测试下。SQL2005

结果:可能走,可能不走
[/Quote]
SQL77 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sleepzzzzz 的回复:]
你说的,都懂的。

就这例子,测试下。SQL2005
[/Quote]
结果:可能走,可能不走
sleepzzzzz 2011-06-24
  • 打赏
  • 举报
回复
你说的,都懂的。

就这例子,测试下。SQL2005
SQL77 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sleepzzzzz 的回复:]
SQL77 老兄,要么先你帮我测下?呵呵
[/Quote]
要真实环境最好:
你的查询能不能走索引主要因素是你的表索引结构,表数据量,最重要的是你查询时的参数
sleepzzzzz 2011-06-24
  • 打赏
  • 举报
回复
SQL77 老兄,要么先你帮我测下?呵呵
GoAwayZ 2011-06-24
  • 打赏
  • 举报
回复
你可以创建视图索引。T-SQL索引视图
sleepzzzzz 2011-06-24
  • 打赏
  • 举报
回复
是因为想起之前的应用遇到了这个问题,所临时发帖先了解下,现在身边没有环境测试。

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

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

楼主有测试过吗????测试了再说,索引没楼主想的那么简单
[/Quote]
SQL77 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sleepzzzzz 的回复:]
谢谢楼上两位。

也就是说,sql server 不会自动去走pid字段上这个索引吗?不明白为什么
[/Quote]
楼主有测试过吗????测试了再说,索引没楼主想的那么简单
xuexiaodong2009 2011-06-24
  • 打赏
  • 举报
回复
和查询条件有关的,系统会主动处理的,
cd731107 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sleepzzzzz 的回复:]
谢谢楼上两位。

也就是说,sql server 不会自动去走pid字段上这个索引吗?不明白为什么
[/Quote]
是的,那个索引是用在表上的,而不是建立在视图上,所以要在此视图建立索引

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧