1
13
尝试在stories.lastActivityAt上添加索引。我认为执行计划中的聚集索引扫描可能是由于排序。 编辑: 由于我的查询在一瞬间返回,行只有几个字节长,但已经运行了5分钟,并且在添加了2K varchar之后仍在继续,所以我认为Mitch有一个观点。正是这些数据的容量被毫无意义地乱移,但这可以在查询中修复。 尝试将join、sort和top(10)放在视图或嵌套查询中,然后针对story表进行join,以获取所需10行的其余数据。 这样地:
如果您有lastactivityat的索引,那么应该运行得非常快。 |
2
3
因此,如果我正确地阅读了第一部分,它将在17秒内用索引响应。这还需要一段时间才能翻出10张唱片。我想时间是按顺序排列的。我想要一个LastActivityAt、UserID、CategoryID的索引。只是为了好玩,删除之前的订单,看看它是否能快速返回10条记录。如果是这样,那么您就知道它不在与其他表的联接中。此外,将*替换为所需的列也会很有帮助,因为在排序时,所有3个表列都在tempdb中—正如Neil所提到的。 看看执行计划,你会注意到额外的排序——我相信这是需要一些时间的排序。我假设你有一个3的索引,那是17秒…因此,您可能需要一个用于联接条件(userid、categoryid)的索引和另一个用于lastactivityat的索引—看看是否性能更好。另外,最好通过索引优化向导运行查询。 |
3
1
我的第一个建议是删除*,并用所需的最小列替换它。 第二,是否涉及触发器?更新lastactivityat字段的内容? |
4
1
根据问题查询,尝试在表上添加组合索引
|
5
1
您正在最大限度地利用硬件设置中的磁盘。 考虑到您对数据/日志/tempdb文件放置的评论,我认为任何数量的调优都将是一个创可贴。 25万行很小。想象一下,1000万行的话,你的问题会有多严重。 我建议您将tempdb移动到它自己的物理驱动器上(最好是RAID 0)。 |
6
1
好吧,所以我的测试机不快。实际上很慢。它1.6 GHz,1 GB的RAM,没有多个磁盘,只有一个(读慢)磁盘用于SQL Server、OS和Extras。 我用定义的主键和外键创建了您的表。 插入2个类别,500个随机用户,25万个随机故事。 运行上面的第一个查询需要16秒(也没有计划缓存)。 如果索引LastActivityAt列,我会在一秒钟内得到结果(这里也没有计划缓存)。 这是我做所有这些的脚本。
这就是你慢下来的原因。 排序主要是在tempdb中完成的,一个大的表将导致添加大量数据。 在此列上有一个索引肯定会提高ORDER BY的性能。 另外,定义主键和外键也可以立即帮助SQL Server 代码中列出的方法很优雅,基本上与cdonner编写的响应相同,除了C而不是SQL。调整数据库可能会得到更好的结果! ——克里斯 |
7
0
在运行每个查询之前,是否清除了SQL Server缓存? 在SQL 2000中,它类似于DBCC DropCleanBuffers。谷歌命令以获取更多信息。 查看查询时,我将为 类别ID 故事.categoryid 用户标识 故事书 而且可能 故事.lastactivityat 但是,听起来结果可能是虚假的缓存成本。 |
Rm558 · 是否可以更改XML类型上的LINQPad代码生成? 6 年前 |
MJK · 规范模式-使用ICollection实现表达式 6 年前 |
Roland Ebner · 为实体框架多对多关系构建表达式树? 6 年前 |