代码之家  ›  专栏  ›  技术社区  ›  Matthew Talbert

如何调试慢速NHibernate Select查询?

  •  3
  • Matthew Talbert  · 技术社区  · 15 年前

    我在数据库上做一个简单的查询,搜索两列。我在列上有一个索引。当我在SQLServerManagementStudio中进行搜索时,只需要几毫秒就可以完成(总是小于10毫秒)。当我在NHibernate中执行相同的查询时,它需要30多秒。我已经分析了查询,生成的SQL很好。我使用的是NHibernate Profiler,当我在NHibernate Profiler中选择“showqueryresults”时,只需不到一秒钟就可以得到结果。我该怎么办?

    EDIT:所以,我决定使用session.CreateSQLQuery()来完成这项工作,它的工作速度非常快。为什么这比另一种方法快?

    表架构:

    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
    
    3 回复  |  直到 15 年前
        1
  •  4
  •   Remus Rusanu    15 年前

    首先,发布探查器显示的精确查询和在SSMS中运行的查询。无意冒犯,但在你看来“不错”的东西可能会向训练有素的人透露大量的信息。其次,发布表的精确模式,包括所有索引。

    datatype precedence (带有 nvarchar varchar 索引结果将进入完整扫描)。

    至于更一般的问题, ,答案是:应用这样的方法 Waits and Queues sys.dm_exec_query_stats , sys.dm_exec_requests , sys.dm_db_index_usage_stats

        2
  •  1
  •   gbn    15 年前

    除了Remus的回答(其中涉及nHibernate对(n)varchar的白痴处理),我还要添加一列 BadData

        3
  •  -1
  •   Alistair    15 年前

    如何使用HQL或criteria框架创建查询?

    我也遇到过同样的情况。运行Nhibernate profiler输出的SQL很快,但是应用程序运行得很慢。从标准框架切换到HQL解决了这个问题。

    我认为criteria框架有一个bug/特性,使得它在某些情况下非常慢。