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

时间:2013-04-12 13:41:53

标签: .net sql sql-server

我们有一个Windows应用程序(用.Net编写),支持大约500多个用户。这个应用程序有一个特定的功能,它可以带回大约4万条记录(在MS SQL Server上),每天运行几次。

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

我正在尝试理解资源分配是如何工作的,因为我觉得40k查询不是很大但是相当大。

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

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

SQL查询非常简单,它从字面上选择特定表中的所有记录(此表包含从其他表中提取的数据,现在大约有40,000条记录,表中大约有50列):< / p>

SELECT * 
FROM MyTable

几乎是查询。没有连接,我正在使用存储过程。

3 个答案:

答案 0 :(得分:1)

我真的没有足够的信息可以说出任何确定的内容,但我可以做出一些猜测/建议。

首先,如果没有写入此表...来自任何来源......当查询处于活动状态时,您可以通过向该选择添加with (nolock)提示来改进。再说一次:只有在查询过程中表保持不变,或者您对此查询感到满意时才会这样做,因为读取时会产生陈旧/错误的结果。

此外,您对查询的描述中的“非常多”这一短语表示可能有某些其他我们没有看到的内容;它仍然很简单,但它是一些东西。如果那个东西是ORDER BY子句,那么使命令与主键匹配(或者将主键与你需要的顺序对齐)也可能有所帮助。

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

最后一个建议是,如果此数据可以过时,您可以尝试将代码添加到服务层以对其进行缓存。

答案 1 :(得分:1)

如果您从MyTable中选择*,它将锁定表格,以便其他人必须等待。

要检查的第一件事 - 在您的代码中,您如何阅读记录?如果您使用的是datareader,它将锁定表,直到您关闭它。使用SQLDataAdapter并将其放入表中。这只会使表锁定实际拉取数据的时间。

另一件事是顽固的人会说不要做拉*。只拉你需要的字段。

如果您不介意使用'脏'数据(未提交),请使用(nolock)从mytable中选择*。这意味着它将获得尚未提交的任何内容。但如果表格没有不断变化,那应该是一个问题。

答案 2 :(得分:0)

40k行x50列是在具有500多个用户的实时系统上提取的大量数据。假设这50列的平均列大小是20个字节,那么你正在检索大约800k的数据,但如果你有很多varchar的100个字节长,那么这个大小将会大幅提升。

我会质疑为什么你需要这么大的查询,显然有太多的数据让某人能够在屏幕上轻松查看。如果它是一个数据提取来提供其他一些数据存储,那么考虑只运行不在办公时间或者让一个进程在后台批量提取它或将数据复制到一个单独的服务器。