Sql server 什么是最好的SQL Server性能优化技术?

Sql server 什么是最好的SQL Server性能优化技术?,sql-server,optimization,Sql Server,Optimization,我一直采用的方法是,首先使用最少的一组索引部署数据库,然后根据性能要求添加/更改索引 这种方法相当有效。然而,它仍然没有告诉我在哪里可以提高性能。它只告诉我哪里的性能太差以至于用户抱怨 目前,我正在很多应用程序上重构数据库对象 既然“过早优化是万恶之源”,那么我是否应该不厌其烦地寻找性能改进呢 在重构应用程序代码时,开发人员一直在寻找提高代码质量的方法。是否有一种方法可以不断地改进数据库性能?如果是,您发现哪些工具和技术最有帮助 我曾经简单地使用过“数据库引擎调优顾问”,但没有发现它有任何帮助。

我一直采用的方法是,首先使用最少的一组索引部署数据库,然后根据性能要求添加/更改索引

这种方法相当有效。然而,它仍然没有告诉我在哪里可以提高性能。它只告诉我哪里的性能太差以至于用户抱怨

目前,我正在很多应用程序上重构数据库对象

既然“过早优化是万恶之源”,那么我是否应该不厌其烦地寻找性能改进呢

在重构应用程序代码时,开发人员一直在寻找提高代码质量的方法。是否有一种方法可以不断地改进数据库性能?如果是,您发现哪些工具和技术最有帮助


我曾经简单地使用过“数据库引擎调优顾问”,但没有发现它有任何帮助。也许我需要更多解释结果的经验。

分析您的查询,不是明显的查询,而是访问不同表、视图等的复杂查询和/或从不同表返回多行的查询


这将准确地告诉您应该将重点放在哪里

您似乎在谈论MS SQL

启动探查器并记录在数据库上运行的最常见查询。 然后在打开执行计划的情况下运行这些查询,您将看到是什么(如果有的话)减慢了您的查询速度。然后,您可以继续优化查询或在字段上添加更多索引


SQL书籍将为您提供分析和查询分析功能的良好概述。

分析是关键,但在使用分析集时,您必须确保它是准确的数据测试集,否则调整工具将无法获得所需的准确结果


另外,2005年使用情况报告的管理对象非常有用

评测之后,将您认为麻烦的查询放入SQL查询分析器,并显示执行计划。确定执行代价高昂的表扫描的查询部分,并对这些表重新编制索引,以最大限度地降低成本

请尝试以下参考资料:



SQL Server执行计划!!!转到此处:

我的方法是使用SQL server Profiler将针对服务器或数据库的命令收集到一个表中。一旦有了它,您就可以根据max和avg执行时间、max和avg cpu时间以及(非常重要的)查询运行的次数进行查询

由于我尝试将所有数据库访问代码都放在存储过程中,所以很容易进行查询。如果使用内联SQL,可能会更困难,因为对查询中的值进行更改会使其看起来像是一个不同的查询。您可以尝试使用LIKE操作符解决这个问题,将相同类型的查询放入相同的存储桶中,以计算聚合(max、avg、count)

一旦你有了一个潜在问题的“前10名”列表,你就可以开始逐个查看它们,看看查询是否可以重新处理,索引是否有帮助,或者进行一个小的架构更改是否合适。为了找出前10名,试着用不同的方式查看数据:平均*计算期间的总成本,最大值表示最严重的违规者,只是简单的平均值,等等

最后,如有必要,确保在不同的时间段进行监控。早上每个人都进入并运行每日报告时,数据库的使用情况可能与中午用户输入新数据时有所不同。您还可以决定,即使某些夜间进程比任何其他查询花费的时间都长,但这并不重要,因为它是在非工作时间运行的


祝你好运

您可能希望检查当前索引的内部和外部框架,然后删除并重新创建它们或重新组织它们。

请确保您正在使用生产卷进行分析-以行数和加载为准。查询及其计划在不同的负载/容量场景下表现不同

当然,您必须分析查询并查看执行计划。但是反复出现的两个主要问题是尽可能快地过滤掉,并尽量避免使用游标

我看到一个应用程序,其中有人将整个数据库中的事件表下载到客户机,然后根据某些条件逐个筛选每一行。将筛选条件传递到数据库并让查询在where子句中应用这些条件,这大大提高了性能。这对于使用数据库的人来说是显而易见的,但我也看到过类似的事情。还有一些人的查询存储了一堆临时表,其中包含了他们不需要的行,这些行在临时表的最终联接中被消除。基本上,如果您从填充临时表的查询中删除,那么查询其余部分的数据就会减少,整个查询运行得更快

光标是显而易见的。如果你有一百万行,一行一行地走,那就要花很长时间。在进行一些测试时,如果您使用“缓慢”的动态语言(如Perl)连接到数据库,并对数据集执行一些逐行操作,那么速度仍将远大于数据库中的游标。用Java/C/C++之类的东西来实现,速度差就更大了。如果您可以在数据库代码中找到/删除游标,它将运行得更快。。。如果必须使用游标,则在任何编程语言中重写该部分并将其从数据库中取出可能会带来巨大的性能提升

关于游标的另一个注意事项是,要注意SELECT@col1=col1、@col2=col2、@col3=col3这样的代码,其中id=@currentid位于一个循环中,该循环通过id,然后在每个列上执行语句。基本上这是一个光标,如w
SELECT Cash, Age, Amount FROM Investments; 
SELECT * FROM Investments;
SELECT Name, count (Name) FROM Investments WHERE Name!= ‘Test’ AND Name!= ‘Value’ GROUP BY Name;
SELECT Name, count (Name) FROM Investments GROUP BY Name HAVING Name!= ‘Test’ AND Name!= ‘Value’ ;
SELECT Amount FROM Investments WHERE (Cash, Fixed) = (SELECT MAX (Cash), MAX (Fixed) FROM Retirements) AND Goal = 1; 
SELECT Amount FROM Investments WHERE Cash = (SELECT MAX (Cash) FROM Retirements) AND Fixed = (SELECT MAX (Fixed) FROM Retirements) AND Goal = 1;
SELECT COUNT(*) FROM [dbo].[PercentageForGoal]
SELECT rows FROM sysindexes
WHERE id = OBJECT_ID('[dbo].[PercentageForGoal]') AND indid< 2