SQL 超时异常,尽管最大池大小设置为 1000000

本文关键字:1000000 设置 异常 超时 SQL | 更新日期: 2023-09-27 18:36:30

我正在使用一个 asp.net 的MVC4项目并使用SQL Server 2008。我的数据库表包含 100000 行。此外,连接字符串属性的最大池大小设置为 1000000,池设置为 true。

我的表结构如下:

CREATE TABLE tblNews
(
ID int IDENTITY(1,1) NOT NULL,
Url nvarchar(300) UNIQUE NOT NULL,
PubDate datetime NOT NULL,
Active bit NOT NULL,
Hit int NOT NULL,
...
)

并且有一个索引如下:

CREATE NONCLUSTERED INDEX indexTblNews_Url
ON tblNews(Url)

我的选择查询是:

CREATE PROC spNewsGet
   @Url nvarchar(300)
AS
   UPDATE tblNews
   SET Hit = Hit + 1
   WHERE Url = @Url
     AND PubDate > GETDATE()
     AND Active = 1;
   SELECT
      *
   FROM tblNews
   WHERE Url = @Url
     AND PubDate > GETDATE()
     AND Active = 1
   ORDER BY PubDate DESC

在低评级的网站上没有问题,这非常有效。但是在像 100000 行这样的大数据库中,每天有 2000000 个单用户的网站,它会崩溃。它会在三个页面之一SqlTimeout抛出异常。因此,当我单击一个页面时,几乎所有页面都给出了上述异常。

我已经检查了硬件性能,处理器消耗为 I7 的 %70 3.6 GHZ,内存消耗为 1.5 GB。但是有更多的空内存。我怎样才能克服这个问题?

任何帮助将不胜感激。

SQL 超时异常,尽管最大池大小设置为 1000000

很可能

您正在使用SqlConnection .尝试将连接的 ConnectionTimeout 属性设置为 0 以指示无限超时。如果不使用 SqlConnection ,则可以设置类似的属性。

它在某些

站点上快速工作,但对其他站点不起作用的一个可能原因是,对于高容量站点,URL 的选择性不再足以使现有索引正常工作。因此,UPDATE可能会升级到行锁定之外,从而导致对聚集/非聚集索引的争用。

我怀疑连接匮乏是一个问题 - 将connection pool max size设置为 32k 以上毫无意义,并发 SQL 连接也将取决于与 .Net 线程相关的因素。

我真的不明白为什么PubDate是未来的日期,但如果PubDate > GETDATE() 和/或Active = 1显着减少更新查询中的记录数量,那么我还会将这些字段中的一个或两个添加到索引中(如适用),即:

CREATE NONCLUSTERED INDEX indexTblNews_Url
ON tblNews(Url, PubDate);

您还将复制查询 - 一次用于更新,一次用于选择。您可以通过临时表减少冗余并重新加入其中。

CREATE PROC spNewsGet
@Url nvarchar(300)
AS
  SELECT ID
  INTO #tmp
  FROM tblNews
  WHERE Url = @Url
  AND PubDate > GETDATE()
  AND Active = 1;
  UPDATE tblNews
  SET Hit = Hit + 1
  FROM tblNews INNER JOIN #tmp on #tmp.ID = tblNews.ID;
  -- Consider also using SET TRANSACTION ISOLATION SNAPSHOT or READ UNCOMMITTED here.
  SELECT tblNews.*
  FROM tblNews INNER JOIN #tmp on #tmp.ID = tblNews.ID
  ORDER BY PubDate DESC;
GO

最后,根据注释,您可以考虑在最终选择时删除隔离级别,前提是结果集不用于"事务关键"用途。