【发布时间】:2013-01-29 20:27:29
【问题描述】:
使用 MSSQL 和 MSSQL Server Management Studio,我有一个相当复杂的查询,其中包含一些连接和几个子查询。
选择的一个属性是一个名为 Duration 的小数 (19,5)。当使用 NHibernate 的 Queryover 在 SelectSubQuery 中获取此列时,由于某种原因,我的对象需要大约 2 分钟来水合,查询只有几毫秒。
手动添加索引,右键单击索引 -> 添加索引,在 (Id, Duration) 上使查询稍微快一些,并且水合可以接受,不是完美无缺,但足够好。但是,如果我右键单击索引 -> 脚本索引为,并运行创建的脚本,它不会提高查询的性能。
Script Index As 创建
CREATE NONCLUSTERED INDEX [idx_Duration] ON [Table]
(
[Id] ASC,
[Duration] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF,
IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
所以我可以说,手动创建的索引会提高性能,而脚本索引不会。
【问题讨论】:
-
两种情况下查询的执行计划有变化吗?您是否尝试重新计算统计数据?
-
诸如“右键单击索引”之类的语句几乎毫无意义,因为您没有提到这是来自什么工具,甚至没有提到什么数据库系统。
-
这里有什么不完全加起来...创建索引。在物体水合过程中,您是否可能遇到一些 SELECT N+1 问题?
-
这是哪个 RDBMS?标签不告诉你。
-
语法看起来像 MSSQL。我认为执行计划已被缓存。阅读运行
DBCC FREEPROCCACHE的后果,然后在合适的情况下运行它。如果这不是计划,那么也许 NHibernate 正在设置一些奇怪的选项来阻止 SQL Server 使用 NHibernate 会话中的索引。
标签: sql sql-server nhibernate indexing