我有正常的选择查询,执行时间约为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
答案 0 :(得分:2)
这台机器上还有其他事情发生了吗?
即使您制作了最糟糕的数据结构,SELECT * FROM Users也不应该花费3秒来获取310条记录。内部有更多(更多)记录,或者SQL服务器之外存在一些问题(其他一些进程阻塞代码或硬件问题)。
答案 1 :(得分:2)
由于没有where子句,这不是索引等,Sql将执行全表扫描并返回所有数据。我会关注机器上运行的其他东西,或者SQL运行了很长时间并耗尽了大量的VM。最重要的是,这不是SQL问题 - 这是一个机器问题。
答案 2 :(得分:1)
嗯,索引在这里并不重要 - 您正在使用该查询进行表扫描。
所以,只有少数其他项目可以阻止这种情况发生。一个是行大小。你有什么专栏?如果你有大量的文本或图像列,这可能会导致延迟恢复它们。
至于你的硬件,你的硬盘的RPM是多少?请记住,这是从磁盘读取,因此如果执行任何其他IO任务,这显然会导致性能损失。
答案 3 :(得分:1)
你应该考虑很多事情:
"select * from"
总是一个坏主意。将其更改为仅获取所需的列。"where"
还是“order by"
子句。如果是这样,您需要确保正确设置索引(即使是330行,因为表总是比您想象的要大)。 EXPLAIN
或Microsoft提供的任何工具作为等效工具。它将向您显示查询运行缓慢的原因。答案 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条记录。没有不同......
我在堆栈中看到类似的帖子..你可以通过这个