【问题标题】:SQL Index: Increases performance when added manually, but scripted does notSQL 索引:手动添加时会提高性能,但脚本不会
【发布时间】: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


【解决方案1】:

使用设计器创建索引或右键单击对象并编写脚本时,Management Studio 中的相同代码用于生成 SQL。 (两者都使用 SMO - Sql 管理对象库)。您可以通过使用 Profiler 捕获 SSMS 生成的 sql 语句来验证它们是否相同。

【讨论】:

    猜你喜欢
    • 2014-11-25
    • 1970-01-01
    • 2019-03-26
    • 2015-11-17
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多