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。但是有更多的空内存。我怎样才能克服这个问题?
任何帮助将不胜感激。
您正在使用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
最后,根据注释,您可以考虑在最终选择时删除隔离级别,前提是结果集不用于"事务关键"用途。