我有一个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位字段。