【发布时间】:2011-03-16 18:24:33
【问题描述】:
我正在对数据库进行简单查询,搜索两列。我在列上有一个索引。当我在 SQL Server Management Studio 中进行搜索时,只需几毫秒即可完成(总是少于 10 毫秒)。当我在 NHibernate 中执行相同的查询时,需要 30 多秒。我已经分析了查询,生成的 SQL 很好。我正在使用 NHibernate Profiler,当我在 NHibernate Profiler 中选择“显示查询结果”时,只需不到一秒钟的时间即可获得结果。我该从哪里调试这个?
编辑:所以,我决定使用 session.CreateSQLQuery() 来执行此操作,它运行得非常快。为什么这会比其他方法更快?
编辑:似乎使用查询参数是问题所在。我创建了一个没有参数的 HQL 查询,这很好。一旦我添加了命名参数,查询执行时间就会急剧增加。
表格架构:
CREATE TABLE [dbo].[CRDefendant](
[Id] [int] NOT NULL,
[FirstName] [varchar](30) NULL,
[LastName] [varchar](30) NULL,
[MiddleName] [varchar](30) NULL,
[Race] [char](1) NULL,
[Sex] [char](1) NULL,
[BirthDate] [char](10) NULL,
[Social] [int] NULL,
[BadData] [varchar](50) NULL,
CONSTRAINT [PK__CRDefend__3214EC073B95D2F1] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [GROUP3]
) ON [GROUP3]
GO
查询:
SELECT this_.Id as Id16_0_, this_.FirstName as FirstName16_0_, this_.LastName as LastName16_0_, this_.MiddleName as MiddleName16_0_, this_.Race as Race16_0_, this_.Sex as Sex16_0_, this_.BirthDate as BirthDate16_0_, this_.Social as Social16_0_, this_.BadData as BadData16_0_ FROM [CRDefendant] this_ WHERE this_.LastName = @p0 and this_.FirstName like @p1
索引:
CREATE INDEX IX_CRDefendant_Name_DOB
ON CRDefendant (LastName ASC, FirstName ASC, BirthDate ASC)
INCLUDE (MiddleName, Race, Sex, Social)
ON GROUP3
【问题讨论】:
标签: sql-server nhibernate fluent-nhibernate