我在一个表中发现有50万条记录,当我们通过发出一个sql从sql server表中获取数据时需要一分钟。有一个主键意味着已经有一个集群索引。我只是不明白为什么需要一分钟。除索引之外,还有哪些方法可以优化表格以更快地获取数据。在这种情况下我需要做些什么来加快响应速度。还告诉我如何编写始终优化的sql。请告诉我优化的所有步骤。
感谢。
答案 0 :(得分:3)
优化表中索引的最快方法是使用SQL Server Tuning Advisor。看看http://www.youtube.com/watch?v=gjT8wL92mqE< - here
答案 1 :(得分:1)
如果您正在运行select * from employee
(根据问题评论),那么没有任何索引可以帮助您。这是一个“每一行的每一行”查询:没有任何魔力。
添加WHERE通常也不会对select *
查询有所帮助。
您可以检查的是索引和统计信息维护。你做的吗?这是一个Google search
或者更改您使用数据的方式......
编辑:
为什么WHERE子句通常不起作用......
如果你添加一个不是PK的WHERE ..
除非存在网络问题或类似问题,否则问题是读取所有列不缺少WHERE
如果您SELECT col13 FROM MyTable
并且col13
上有索引,则可能会使用该索引。
SELECT * FROM MyTable WHERE DateCol < '20090101'
索引位于DateCol
但匹配表的40%,它可能会被忽略,或者您有昂贵的键/书签查找
答案 2 :(得分:1)
仅选择所需的列,而不是选择*。如果您的桌子有一些大的列,例如OLE类型或其他二进制数据(可能用于存储图像等)然后您可能会从磁盘和网络上传输比您需要的更多的数据。
正如其他人所说,当您选择所有行(没有where子句)时,索引对您没有帮助。在这种情况下使用索引会比较慢,因为每行的索引读取和表查找与全表扫描相比。
答案 3 :(得分:0)
无论将整个表格返回到您的应用程序的优点如何,只需要很长时间才能检索到50000行员工数据。
您的查询是ORDER BY
还是只是select * from employee
?
employee
表的定义是什么?它是否包含任何特别宽的列?您是否将二进制数据(如简历或员工照片)存储在其中?
您如何发布SQL并检索结果?
运行的select语句有什么隔离级别(可以使用SQL事件探查器来检查)
你遇到阻塞吗?将NOLOCK
添加到查询中会显着加快速度吗?