选择查询需要3秒才能提取330条记录。需要优化

时间:2009-08-03 06:51:16

标签: sql sql-server sql-server-2005 performance optimization

我有正常的选择查询,执行时间约为3秒(Select * from users)。用户表中只有310条记录。

我的生产服务器的配置是

SQl Server Express Editon 服务器配置:Pentium 4 HT,3 ghz,2 GB ram

Column Nam  Type    NULL    COMMENTS
Column Nam              Type            NULL               
user_companyId          int         Not  Null
user_userId             int         Not Null Primary Column
user_FirstName          nvarchar(50)        Null                
user_lastName           nvarchar(60)        Null                
user_logon              nvarchar(50)        Null                
user_password           nvarchar(255)       Null                
user_emailid            nvarchar(255)       Null                
user_status             bit         Null                
user_Notification           bit         Null                
user_role               int         Null                
user_verifyActivation       nvarchar(255)       Null                
user_verifyEmail            nvarchar(255)       Null                
user_loginattempt           smallint        Null                
user_createdby          int         Null                
user_updatedby          int         Null                
user_createddate            datetime        Null                
user_updateddate            datetime        Null                
user_Department         nvarchar(1000)      Null                
user_Designation            nvarchar(1000)      Null        

10 个答案:

答案 0 :(得分:2)

这台机器上还有其他事情发生了吗?

即使您制作了最糟糕的数据结构,SELECT * FROM Users也不应该花费3秒来获取310条记录。内部有更多(更多)记录,或者SQL服务器之外存在一些问题(其他一些进程阻塞代码或硬件问题)。

答案 1 :(得分:2)

由于没有where子句,这不是索引等,Sql将执行全表扫描并返回所有数据。我会关注机器上运行的其他东西,或者SQL运行了很长时间并耗尽了大量的VM。最重要的是,这不是SQL问题 - 这是一个机器问题。

答案 2 :(得分:1)

嗯,索引在这里并不重要 - 您正在使用该查询进行表扫描。

所以,只有少数其他项目可以阻止这种情况发生。一个是行大小。你有什么专栏?如果你有大量的文本或图像列,这可能会导致延迟恢复它们。

至于你的硬件,你的硬盘的RPM是多少?请记住,这是从磁盘读取,因此如果执行任何其他IO任务,这显然会导致性能损失。

答案 3 :(得分:1)

你应该考虑很多事情:

  • 不要使用Express版本,它可能是因为某种原因而被称为。使用真正的DBMS(是的,这包括非快速SQL Server)。
  • 除非您绝对需要每一栏,否则使用"select * from"总是一个坏主意。将其更改为仅获取所需的列。
  • 您使用的是"where"还是“order by"子句。如果是这样,您需要确保正确设置索引(即使是330行,因为表总是比您想象的要大)。
  • 使用EXPLAIN或Microsoft提供的任何工具作为等效工具。它将向您显示查询运行缓慢的原因。
  • 如果您的数据库位于不同的计算机上,则可能存在网络问题(不一定是问题,例如,您可能会使用状态数据包过滤器来减慢连接速度。)
  • 检查您正在使用的盒子的系统负载。如果有其他进程使用大量CPU grunt或磁盘I / O,则可能导致速度减慢。

答案 4 :(得分:0)

如果没有表结构来了解你的表格是什么样的,我们就无法回答这个问题......

如果不使用SELECT * FROM Users,但实际上从表中指定了哪些字段?

SELECT user_companyId, user_userId,
       user_FirstName, user_lastName, user_logon
FROM Users

这是如何表现的?此查询还需要3秒钟,还是显着更快?

如果您确实需要所有用户及其所有属性,那么这可能只是系统检索该数据量所需的时间。加快速度的最好方法是通过指定字段列表来限制检索的属性(你真的需要用户的照片吗?),并限制使用WHERE子句检索的元素数量(你呢)真的需要所有用户吗?不只是那些.........)

马克

答案 5 :(得分:0)

最好的办法是分析服务器,并注意查询期间发生的锁类型。

如果使用任何隔离级别选项或默认值,请确定是否可以降低隔离级别,这将减少表上发生的锁定。发生的锁定越多,查询必须等待其他查询完成的冲突就越多。但是,在降低隔离级别时要非常小心,因为您需要了解这将如何影响您获得的数据。

确定您是否可以在查询中添加条件。限制查询的记录可以减少锁定。

编辑:如果发现锁定问题,您还需要评估正在运行的任何其他查询。

答案 6 :(得分:0)

如果它始终为3秒,则问题不在于查询或架构,因为任何理由对设计师来说都不是显而易见的。我猜它是硬件或网络问题。你有什么办法可以用数据库做3秒钟吗? SET STATISTICS IO ON和SET STATISTICS TIME ON告诉你什么?我打赌那里没有任何支持3秒钟。

答案 7 :(得分:0)

如果没有更好的索引策略,将某些列排除在外只会减少对网络的影响,这对于仅310行来说不应该是非常糟糕的。我的猜测是这是一个锁定问题。

所以考虑使用:

SELECT * FROM Users (NOLOCK);

这意味着您不会尊重其他连接当前在桌面上的任何锁定。您可能会看到“脏读”,看到尚未提交的数据 - 但从性能角度来看,它可能是值得的。

让我们面对现实吧 - 如果你考虑过后果,那应该没问题......

罗布

答案 8 :(得分:0)

对于任何性能问题,您应该做的第一件事是成为查询的执行计划 - 这是SQL Server在执行查询时选择的运行路径的表示。查找有关如何执行此操作的信息的最佳位置是Google - 您需要统计信息计划,因为它包含有关返回行数的信息。

这听起来不像执行计划的问题,因为查询很简单 - 实际上我很确定查询算作“琐碎的计划”,即只有一个可能的计划。

这会导致锁定或硬件问题(生成数据库上的查询速度很慢,而且总是很慢或执行时间是否变化?)查询将尝试在整个表上获得共享锁 - 如果有人是写作然后你将被禁止阅读,直到作家完成。您可以通过查看DMV来查看我们是否是您的问题的根源,请参阅http://sqllearningsdmvdmf.blogspot.com/2009/03/top-10-resource-wait-times.html

最后,在CPU利用率,内存使用等方面对SQL Express有限制......服务器上的负载是什么样的? (每秒操作数)

答案 9 :(得分:0)

是否有可能根据列大小(列中数据的长度)降低性能。

在你的表中,你得到了最后2列,其大小为NVARCHAR(1000),它是否总是充满了那么多的数据.. ??

我不是一个sql专家,但考虑一下这个2列&的数据包大小即将返回310条记录。没有不同......

我在堆栈中看到类似的帖子..你可以通过这个

performance-in-sql