怎么建索引

snlixing 2017-11-07 12:25:52
SELECT ID, BDID, ContractNO, OldContractNO, ProductNO, PTID, machineno, drumno, OutputDate, BanCi, FinishNum, DrumWeight, 
RuKuFlag,
ROW_NUMBER() OVER(PARTITION BY PTID,Machineno,Drumno ORDER BY OutPutDate ASC, BanCi DESC) AS
rn
FROM dbo.Drumdetail


这个怎么建立索引呢,PTID,Machineno,Drumno,OutPutDate ,BanCi 在这些上建非聚集索引,执行计划没什么变化呢

...全文
196 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 版主 2017-11-07
  • 打赏
  • 举报
回复
可以说, 没有 where 限制的语句, 一般情况下都是有问题的。 对DBA来说, 发现了就会上报, 因为这种语句会引起服务器压力上升。 而用户一般也看不了这么多的数据, 没有意义。
吉普赛的歌 版主 2017-11-07
  • 打赏
  • 举报
回复
引用 5 楼 snlixing 的回复:
那什么时候用索引比较妥呢
前面说过了:百里挑一。 比如动物园里面有一群猴子,你想找一只出来给你看看, 那你得告诉管理员, 它是什么样特征的?毛色发红?尾巴比较长?(非聚集索引查找/扫描) 编号为 23? (聚集索引查找) 但如果你要把这群猴子全部赶出来, 或者赶一大半出来, 这种就不用管理员费心思挑了, 过来一个是一个就是了(表扫描/聚集索引扫描) 上面为了形象地说明, 用了通俗易懂的方式, 可能有遗漏的地方(比如小表可能建立了索引也没什么用),就不细究了。 索引能不能用到, 关键还是在于SQL Server的感知, 还跟统计信息、索引碎片 有关…… 总之, SQL Server会走它认为的最小的消耗去产生执行计划, 它自己产生的执行计划, 99.9% 情况下可以认为是正确的。 当然, 你也可以强制让他走你设计好的索引 比如:
USE [AdventureWorks2014]
GO
SELECT TOP 1 *
  FROM [Person].[Person]
WITH(INDEX(IX_Person_LastName_FirstName_MiddleName))
但这并不一定能带来好的效果。 最简单的评价方式是在 两种不同的语句 前面加:
SET STATISTICS IO ON
SET STATISTICS TIME ON
之后, 再比较两种不同语句(最好开两个窗口来执行)的 CPU, IO 读取的差别。 #4 说得有一定道理, 可能会一定作用。 但这个改动太大, 不建议。 聚集索引只有一个, 只有最常用到的方面的字段才适合作为聚集索引。 主键在大多数时候是适合用聚集的。
snlixing 2017-11-07
  • 打赏
  • 举报
回复
引用 4 楼 qq_37170555 的回复:
[quote=引用 2 楼 snlixing 的回复:] [quote=引用 1 楼 yenange 的回复:] 你一个条件都不加, 相当于要SQL Server显示出所有数据, 索引能起到作用吗? 索引无非就是百里挑一, 帮你筛选节省时间。 你有一百个就得出一百个, 那就没得说了, 神仙也没办法。
ROW_NUMBER() OVER(PARTITION BY PTID,Machineno,Drumno ORDER BY OutPutDate ASC, BanCi DESC)  这里有条件啊[/quote] 在这些字段上面建立聚集索引是可以起到作用的,不过前提是这些字段的数据会不会重复。你可以试试看[/quote] 这些都是重复的字段
snlixing 2017-11-07
  • 打赏
  • 举报
回复
引用 3 楼 yenange 的回复:
[quote=引用 2 楼 snlixing 的回复:] [quote=引用 1 楼 yenange 的回复:] 你一个条件都不加, 相当于要SQL Server显示出所有数据, 索引能起到作用吗? 索引无非就是百里挑一, 帮你筛选节省时间。 你有一百个就得出一百个, 那就没得说了, 神仙也没办法。
ROW_NUMBER() OVER(PARTITION BY PTID,Machineno,Drumno ORDER BY OutPutDate ASC, BanCi DESC)  这里有条件啊[/quote] 这里并没有减少最终结果集的显示(你觉得 有这个比没这个少显示了一条数据? )。 SQL Server 认为用索引跟没用索引没区别,有索引效率也不高,所以表扫描(聚集索引扫描)了。[/quote] 那什么时候用索引比较妥呢
听雨停了 2017-11-07
  • 打赏
  • 举报
回复
引用 2 楼 snlixing 的回复:
[quote=引用 1 楼 yenange 的回复:] 你一个条件都不加, 相当于要SQL Server显示出所有数据, 索引能起到作用吗? 索引无非就是百里挑一, 帮你筛选节省时间。 你有一百个就得出一百个, 那就没得说了, 神仙也没办法。
ROW_NUMBER() OVER(PARTITION BY PTID,Machineno,Drumno ORDER BY OutPutDate ASC, BanCi DESC)  这里有条件啊[/quote] 在这些字段上面建立聚集索引是可以起到作用的,不过前提是这些字段的数据会不会重复。你可以试试看
吉普赛的歌 版主 2017-11-07
  • 打赏
  • 举报
回复
引用 2 楼 snlixing 的回复:
[quote=引用 1 楼 yenange 的回复:] 你一个条件都不加, 相当于要SQL Server显示出所有数据, 索引能起到作用吗? 索引无非就是百里挑一, 帮你筛选节省时间。 你有一百个就得出一百个, 那就没得说了, 神仙也没办法。
ROW_NUMBER() OVER(PARTITION BY PTID,Machineno,Drumno ORDER BY OutPutDate ASC, BanCi DESC)  这里有条件啊[/quote] 这里并没有减少最终结果集的显示(你觉得 有这个比没这个少显示了一条数据? )。 SQL Server 认为用索引跟没用索引没区别,有索引效率也不高,所以表扫描(聚集索引扫描)了。
snlixing 2017-11-07
  • 打赏
  • 举报
回复
引用 1 楼 yenange 的回复:
你一个条件都不加, 相当于要SQL Server显示出所有数据, 索引能起到作用吗? 索引无非就是百里挑一, 帮你筛选节省时间。 你有一百个就得出一百个, 那就没得说了, 神仙也没办法。
ROW_NUMBER() OVER(PARTITION BY PTID,Machineno,Drumno ORDER BY OutPutDate ASC, BanCi DESC)  这里有条件啊
吉普赛的歌 版主 2017-11-07
  • 打赏
  • 举报
回复
你一个条件都不加, 相当于要SQL Server显示出所有数据, 索引能起到作用吗? 索引无非就是百里挑一, 帮你筛选节省时间。 你有一百个就得出一百个, 那就没得说了, 神仙也没办法。

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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