选择查询太慢> 5分钟

时间:2011-03-27 18:20:09

标签: sql sql-server tsql sql-server-2008

我有一张表MyTable,有29,000行。

MyTable structure {
  StudentId bigint,
  ....
}

列数> 10列。托管服务器中的数据库。

从SSMS执行查询:

SELECT *
  FROM MyTable

执行持续时间超过5分钟是否正常?

3 个答案:

答案 0 :(得分:2)

首先,从远程数据库中检索所有数据绝不是一个好主意。您正在使用重要的带宽份额。希望您使用的查询仅用于调试目的,不应该生产。

您没有提到在开始接收内容之前花了5分钟,或者您是否在5分钟内以恒定速率接收数据。

在第一种情况下,由于其他操作,根本没有接收行可能表示锁对您的表有效。

在后一种情况下,您不断收到行,但速度很慢。带宽和服务器负载在其中起着重要作用。为了让您大致了解下载的数据量,请运行以下存储过程:

EXEC sp_spaceused 'YourTableName';

考虑服务器必须上传该数据,并且您必须下载数据。

二进制和xml字段(也称为BLOB字段)通常会占用大量数据,您可能无法控制用户在这些字段中存储的数据量。

尝试通过在列上运行DATALENGTH来检查变量长度字段(varchar,xml和varbinary)的大小:

SELECT DATALENGTH(MyField) FROM MyTable

您还可以获得平均值:

SELECT AVG(DATALENGTH(MyField)) FROM MyTable

关于BLOB字段的一个好主意是只在needer时检索它们,而不是在加载数据列表时检索它们。

例如,假设存储在PurchaseOrder表中的XML字段。如果您希望向用户显示PO列表,通常不需要检索该字段,除非用户打开PO。

许多最近的ORM,如nHibernate,为列提供延迟加载,以及分页,因此您可以检索少量行。

Ayende posted a rent关于在两周前加载无限结果集。

答案 1 :(得分:0)

你是对的 - 选择查询不应该花那么长时间。这不是行数。可能它是你在该表/视图上获得的数据类型,也许是存储配置(慢速磁盘,文件组配置等)。

要考虑解决此性能问题的一些想法:

  • 特定于要检索的列。对于即席查询,SELECT *很好,但是要认识到RDBMS会稍微努力确定表/视图中的哪些列。
  • 根据这些字段中的数据,收集数据类型textvarbinary的任何列的值将按比例缩短。
  • 考虑表/视图上的索引(你有吗?)?
  • 这是一个Prod数据库,其中更多/其他活动可能会触及此表?

如果您编辑问题,可能包括完整的表定义,以便我们可以真实地了解数据类型发生的情况。

答案 2 :(得分:0)

我建议您考虑OMG小马的建议 - 可能是由于盒子和机器之间的带宽,所以

  • 尝试远程显示该框,并查看该查询在该计算机上执行的时间。
  • 如果花费的时间几乎相同,则问题出在数据库设计或底层硬件或其他因素(表数据类型,错误索引,计算机上的总体负载,此表的总体命中等)< / LI>
  • 如果花费的时间少得多,那么问题肯定在你的机器和盒子之间 - 理想情况下这应该不是一个大问题,因为web服务器将更接近数据库服务器,可能在同一局域网上(所以它在现实世界中要快得多)。另外,我确信你不会在实际应用程序中使用'Select *'来选择29000行,所以它不会产生很多问题。