我有一个需要优化的SQL Server数据库。我真的很难。我真的是SQL Server的新手,数据库优化对我来说是一个全新的领域。谁能建议我优化步骤?
我尝试了一些,它似乎在某些地方工作而不在其他地方工作。我尝试了以下方法:
在存储过程中用临时表替换了表变量。我还向这些临时表中添加了非聚集索引
将传递给过程的参数复制到局部变量中,并在其余过程中使用局部变量。
与WITH RECOMPILE选项一起使用。
尝试通过物理创建新表并将旧数据存储在其中来减小表的大小。
我想让您知道数据库中的所有表都已建立索引。适当的数据类型也随处可见。我已经分析了这些。请提出一些我可以用来成功优化数据库的方法,以便更快地获取数据并减少执行时间。
请问我到底是否需要任何信息。
答案 0 :(得分:1)
可悲的是,没有一种方法可以以一种方法或以大笔画进行优化。每个过程可能都不相同,并且所利用的每个对象都是与更大机器连接的自己的一组齿轮。结果,没有人能够为您提供所需的魔术子弹。对不起。但是,这里有一些我们可以讨论的信息。
在存储过程中用临时表替换了表变量 还向该临时表添加了非聚集索引。
很多人会说“做X时总是使用temp / variables / cte's”,但这根本没有道理。使用对您的过程有效的方法,不要让自己相信在一个存储过程中使用临时表将对所有这些方法都有效。在每种情况下,这都取决于实际情况。尽管我很难相信表变量比任何其他选项都具有或多或少的性能。通常,这种事情是个人喜好或易于排除故障的事情。
将传递给过程的参数复制到局部变量中,并使用 该过程的其余部分将使用局部变量。
我不知道为什么,但是当我在两种奇怪的情况下不这样做时,我已经看到执行计划变得疯狂。从未对其进行全面研究以了解其原因,但是它对我来说也适用于几个存储过程。再说一次,情况并非总是如此,而且通常并不重要。
与WITH RECOMPILE选项一起使用。
这实际上与上面的一样,我相信参数嗅探是相同的问题。您可能会想要,但可能不会。
尝试通过物理创建新表来减小表的大小,并 在其中存储旧数据。
哇,太好了!我认为以前从未允许过我这样做,所以您能够做到这一点真是太棒了。请记住,有时这可能会导致其他问题(扔一个杠杆,另一个杠杆被卡住),因此记录下来以使人们知道去往历史数据的去向很重要。
我想让您知道数据库中的所有表都是 索引。适当的数据类型也随处可见。我分析过 这些。
这有时可能会过大。我不喜欢堆表,但是它们经常有一个目的,所以我不会打折。请记住,太多索引对您无济于事,反而会伤人。确保您拥有的索引很有价值并且正在被使用。考虑摆脱那些从未使用过的索引。
请向我建议可以成功优化广告资源的方法 数据库,这样数据获取将更快并且执行时间 将减少。
对我而言,优化数据库的最大问题始终是表体系结构。事情是第三范式吗?表格如何相对排列?您是否有太多VARCHAR(MAX)
列?用户如何查询数据,我是否可以优化表结构以允许有效的联接?如果根本不做很多事情,那将是无法很快完成的,因为这样做可能会阻碍更改数据库的体系结构,这是正确的。许多旧系统将崩溃,用户将不得不重新编写查询等。实际上,第一步是查看数据库的使用方式以及存储的数据。从那里,您可以开始了解架构和设计的一些低效率,然后为它们解决问题。
最后,让我们看一下数据库文件的排列方式。您是否有多个数据库文件分布在多个硬盘上?还是您正在使用固态驱动器?您的非聚集索引是否在自己的文件中?文件如何分组?您是否有足够的资源专用于服务器的SQL引擎?该服务器上还运行着什么?您可以对所有这些进行深入研究。祝你好运!