1

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

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

我试图了解资源分配是如何工作的,因为我觉得 40k 查询并不完全庞大,但相当大。

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

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

SQL 查询非常简单,它从特定表中选择所有记录(该表包含从其他表中提取的数据,现在大约有 40k 条记录,表中大约有 50 列):

SELECT * 
FROM MyTable

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

4

3 回答 3

1

If you do select * from MyTable it's going to lock the table so everybody else has to wait.

First thing to check - in your code, how are you reading the records? If you are using a datareader, it will lock the table until you close it. Use a SQLDataAdapter and put it into a table. That will only leave the table locked for the time it takes actually pull the data.

Another thing is the die hards will say don't do a * on the pull. Only pull the fields you need.

If you don't mind having 'dirty' data (non-committed) do a select * from mytable with (nolock). That means that it will get anything that hasn't been committed yet. But if the tables is not changing constantly, that should be an issue.

于 2013-04-12T14:04:09.120 回答
1

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

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

此外,您对查询的描述中的短语“差不多”表明我们可能没有看到其他内容;它仍然很简单,但它是一些东西。如果该内容是 ORDER BY 子句,则使顺序与主键匹配(或将主键与您需要的顺序对齐)也可能会有所帮助。

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

最后一个建议是,如果这些数据过时是可以的,您可以尝试将代码添加到您的服务层以缓存它。

于 2013-04-12T13:57:37.233 回答
0

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

我会质疑为什么您需要如此庞大的查询,对于某人而言,显然数据太多了,无法在屏幕上舒适地查看。如果它是为其他数据存储提供数据的数据提取,那么请考虑仅在非办公时间运行,或者在后台分批提取数据或将数据复制到单独的服务器。

于 2013-04-12T14:27:34.067 回答