.net 影响整个系统的大型数据库查询

.net 影响整个系统的大型数据库查询,.net,sql,sql-server,.net,Sql,Sql Server,我们有一个Windows应用程序(用.Net编写),支持大约500多名用户。此应用程序上有一个特定的函数,它将带回每天运行几次的40k条记录(在MS SQL Server上) 然而,当运行这个大型查询时,系统的其他用户似乎正在“超时”,这在我看来似乎意味着大型查询占用了服务器资源,并导致其他用户无法正确使用系统 我试图理解资源分配是如何工作的,因为我觉得一个40k查询并不是非常庞大,而是相当大 我们的应用程序架构是UI->服务层->Web服务->数据库 是Web服务导致了问题,还是我的查询可能“

我们有一个Windows应用程序(用.Net编写),支持大约500多名用户。此应用程序上有一个特定的函数,它将带回每天运行几次的40k条记录(在MS SQL Server上)

然而,当运行这个大型查询时,系统的其他用户似乎正在“超时”,这在我看来似乎意味着大型查询占用了服务器资源,并导致其他用户无法正确使用系统

我试图理解资源分配是如何工作的,因为我觉得一个40k查询并不是非常庞大,而是相当大

我们的应用程序架构是UI->服务层->Web服务->数据库

是Web服务导致了问题,还是我的查询可能“锁定”了SQL数据库而不让其他用户与之交互

SQL查询非常直截了当,它从一个特定表中选择所有记录(该表包含从其他表中提取的数据,目前约有40k条记录,表中约有50列):


这几乎就是问题所在。没有连接,我使用的是存储过程。

我没有足够的信息来说任何确定的话,但我可以做一些猜测/建议

首先,如果没有写入此表中。。。从任何来源。。。当查询处于活动状态时,您可以通过向该选择添加带有(nolock)提示的
来改进。再次强调:只有在查询过程中表保持不变,或者您对该查询生成的结果感到满意时,才能执行此操作,这些结果由于脏读而过时/错误

此外,在您对查询的描述中,短语“几乎”表示可能还有其他我们没有看到的东西;这仍然很简单,但很重要。如果这是一个ORDERBY子句,那么将ORDER与主键匹配(或者将主键与所需的顺序对齐)可能也会有所帮助

至于作为瓶颈的web服务层与数据库,这应该很容易确定。如果是web服务,您会知道,因为服务层的服务器上CPU、RAM或网络I/O将达到100%,淹没了其他客户端。可能是服务,因为服务网络层必须处理所有数据两次:一次是从数据库中取出数据,另一次是将数据重新传输到最终用户客户端。因此,它的数据使用有一个小的乘数效应。但即便如此,我认为数据库更可能是罪魁祸首


最后一个建议是,如果可以让此数据过时,您可以尝试向服务层添加代码以缓存它。

如果您确实从MyTable中选择*,它将锁定该表,因此其他人都必须等待

首先要签入您的代码,您是如何读取记录的?如果您使用的是datareader,它将锁定表,直到您关闭它。使用SQLDataAdapter并将其放入表中。这只会使表在实际提取数据时保持锁定

另一件事是,顽固派会说,不要一时冲动。只拉你需要的领域


如果您不介意使用“脏”数据(未提交),请使用(nolock)从mytable中选择*。这意味着它将得到任何尚未承诺的东西。但是,如果表没有不断变化,这应该是一个问题。

40k行x50列是需要在一个有500多个用户的实时系统上提取的大量数据。假设这50列的平均列大小为20字节,那么您将检索大约800k的数据,但是如果您有许多varchar的100字节长,那么该大小将显著增加


我想问你们为什么需要这么大的一个查询,显然有太多的数据让人无法在屏幕上轻松浏览。如果是用于提取其他数据存储的数据提取,那么只考虑运行小时或有一个过程将其分批提取到后台或将数据复制到单独的服务器。

可能是后者,您的查询占用数据库服务器。你能告诉我们查询和相关的表结构吗?或者是执行计划?也可能是查询返回了一个非常大的结果集,导致web服务器的内存使用率急剧上升?它影响了多少张桌子?它有很多连接吗?您可以使用视图而不是直接处理表吗?您可以使用存储过程吗?能否缓存结果?执行此查询并返回SSMS中的所有记录需要多长时间?@JoelCoehoorn查询中没有写入操作。它的字面意思是“从表中选择”,对于我所说的那么多行来说,22秒仍然很慢。桌子上有索引吗?谢谢,乔尔,我道歉,因为我想我误解了。有对表的写入,而不是在查询中提取数据。我为这一混乱道歉。如果与(nolock)一起使用,如果在查询过程中尝试写入,会不会导致异常?不会,但可能会导致返回意外数据。通过内部LAN的800K不算什么。是的,它用于数据提取,用户并没有将其视为“实时查询”。@Joel Coelhoorn虽然对于LAN本身来说不是问题,但当数据由已经处理大量处理和I/O请求的服务器提供到LAN上时,这可能非常重要。800k也可以是一个消耗数字。
SELECT * 
FROM MyTable