改进SQL Server中对物理表的选择查询



我有一个184970行9列的表;其中6个标志的值仅为0或1。

当我运行一个简单的选择查询时

select * 
from table

它需要17秒。

我还没有创建任何索引。我应该在哪一列上创建索引(如果有的话(?因为我正在检索所有列

你知道我该如何提高表现吗?

数据库在如何执行此查询方面真的没有选择:

select * 
from table

它需要扫描所有数据并返回。如果你需要表中的所有数据,那么没有什么比全表扫描更快的了。

如何提高绩效?以下是一些想法:

  • 选择较少的列。更少的列意味着从数据库中传递的数据更少。这应该会提高性能
  • 选择较少的行。where子句意味着更少的数据许多where子句可以使用索引进行优化
  • 改善数据库和应用程序之间的网络连接
  • 升级硬件或以其他方式优化运行数据库的服务器

也就是说,我会质疑为什么需要将整个表转储到应用程序中。数据库通常不是这样使用的。

这假设";表";真的是一张桌子。如果它是一个视图,那么所有的赌注都是无效的。您可以使用索引或其他方法来优化视图中的代码。

如果您需要任何表中的所有数据,唯一的改进就是限制数据类型。例如,当你有一个0/1标志时,确保它存储为一个位,而不是一个int或微小的int等。

索引没有任何用处,因为您没有以任何方式加入或筛选结果。

在从磁盘I/O进行读取的硬件更改方面存在一些可能性,即物理读取而不是逻辑读取。此外,如果您的查询在不同的机器上运行到服务器,网络传输速度也会加快,但您在这里陷入了真正的困境。

可能值得在打开时间和i/o统计信息的情况下运行查询,看看查询是物理读取还是逻辑读取。同时尝试在服务器上本地运行查询,以消除可能的网络问题(如果在单独的计算机上(,并将您的发现添加到原始问题中。

除此之外;基本的";从表中选择*并不会给您留下太多选项。

这3列不是位。它们中有巨大的吗?例如varbinary(max(?如果是这样的话,我认为除了选择更少的行之外,你没有什么可做的。

否则,这听起来像是硬件或网络连接问题。我有一个更大的无索引表。SELECT*FROM表在1秒内返回185000行。

如果数据库未托管在本地计算机上。是否可以直接登录到服务器,看看它是否仍然很慢?你可以确认或排除网速问题。

我还会检查内存或CPU是否被征税。重新启动服务器。也许可以增加SQL Server正在使用的可用内存。诸如此类的事情。在一台半吊子的机器上,SQL server的新版本应该能够像往常一样吐出185000位字段。

最新更新