简单查询执行速度非常慢到100行

时间:2016-06-06 17:14:29

标签: asp.net sql-server asp.net-mvc repository-pattern

我使用asp.net mvc,sql server。在我的存储库的类中查询。有时查询在10秒内执行,有时在3分钟内执行!!为什么?我使用的是SQL Server Profiler,但我真的不明白可能是什么原因以及我如何找到它。

查询:

SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[FirstAddressId] AS [FirstAddressId], 
    [Extent1].[SecondAddressId] AS [SecondAddressId], 
    [Extent1].[Distance] AS [Distance], 
    [Extent1].[JsonRoute] AS [JsonRoute]
    FROM [dbo].[AddressXAddressDistances] AS [Extent1]

2 个答案:

答案 0 :(得分:0)

检查您的查询计划。只需在SqlServer Management Studio中运行SELECT语句即可获得真正的查询计划。更多信息请访问:Query plan

如果它们相同,但调用之间的响应时间差异很大,那么问题可能是数据库级别上的lockc(或巨大的活动工作负载)。我的意思是例如不正确的事务隔离级别或者同时运行的某些报告获取太多资源(或者因为某些事情而生成锁定以确保某些开发人员强制执行某些数据一致性)。 许多因素都会影响性能(包括查询执行时可用的内存)。

您还可以运行一些查询来分析统计信息的质量(或者只使用EXEC sp_updatestats更新所有统计信息),或者请分析索引的碎片。我猜,但是通过我锁定和过时的统计信息或碎片整理的索引,可以强制SqlServer选择效率非常低的查询计划。 有关活动锁定的一些信息:Active locks on table

其他信息1: 如果您是此数据库的唯一用户并且它位于本地计算机上(使用SQLServer Express),那么锁定问题就比其他问题更少。尝试打开SqlServer的事件日志。它位于您的引擎实例下的左侧(树)SqlServer Management Studio中:Management / Sql Server Logs / Current。你看到有什么不寻常的信息吗?尝试查看系统日志(使用事件查看器应用程序)。如果出现硬件问题,您应该会看到一些信息。顺便说一句:你在表中有多少行?尝试在某些Process Explorer或Performance Monitor中查看磁盘的行为。如果磁盘队列长度很大,它可能是问题的主要来源(在这种情况下看看哪些应用程序压力磁盘)......

有关锁的更多信息:

    SELECT 
      [spid] = session_Id
    , ecid
    , [blockedBy] = blocking_session_id 
    , [database] = DB_NAME(sp.dbid)
    , [user] = nt_username
    , [status] = er.status
    , [wait] = wait_type
    , [current stmt] = 
        SUBSTRING (
            qt.text, 
            er.statement_start_offset/2,
            (CASE 
                WHEN er.statement_end_offset = -1 THEN DATALENGTH(qt.text)  
                ELSE er.statement_end_offset 
            END - er.statement_start_offset)/2)
    ,[current batch] = qt.text
    , reads
    , logical_reads
    , cpu
    , [time elapsed (ms)] = DATEDIFF(mi, start_time,getdate())
    , program = program_name
    , hostname
    --, nt_domain
    , start_time
    , qt.objectid
FROM sys.dm_exec_requests er
INNER JOIN sys.sysprocesses sp ON er.session_id = sp.spid
CROSS APPLY sys.dm_exec_sql_text(er.sql_handle)as qt
WHERE session_Id > 50              -- Ignore system spids.
AND session_Id NOT IN (@@SPID)     -- Ignore this current statement.
ORDER BY 1, 2
GO

答案 1 :(得分:0)

在你浪费任何时间之前,你应该意识到查询在开发中所花费的时间基本上没有意义。在开发过程中,您在IIS Express中运行单线程Web服务器,这意味着您还可以运行VS,占用大约2-4 GB的RAM。与此同时,您将运行一个SQL Server实例,该系统可以同时处理RAM和硬盘驱动器时间。你没有给出你的系统的任何规格,但如果你碰巧运行的是消费级5400或7200转盘式驱动器而不是SSD,那么这对性能也会产生严重影响。然后,我们甚至还没有进入该系统上可能运行的其他东西。 Photoshop的?外表?您最喜欢的MP3播放列表在后台解码? Windows正在做什么?它可能是下载/应用更新,索引您的驱动器以进行搜索等。当您进入生产阶段时(或者至少不应该),这些都不再适用。在生产中,您应该拥有一个专用服务器,其中包含4-8 GB的RAM和一个专用于SQL Server的SSD或企业级15,000+ RPM盘式驱动器,因此它可以以闪电般的速度吐出查询结果。

多长时间,如果您想要了解应用程序的网站/查询性能,则需要将其部署到您将在生产中运行的传真中。在那里,你可以狠狠地砸掉它并得到一些你可以用它来实际做的真实数据。试图在开发过程中分析您的应用程序只是浪费时间。