我经常使用 SSMS 来测试我的慢速存储过程是否缺少索引。每当我看到“缺少索引(影响 xxx)”时,我的下意识反应就是创建新索引。据我所知,这每次都会导致更快的查询。
为什么我不应该继续这样做?
我正在尝试提高存储过程的性能。当我运行 SP 时,它几乎立即完成,就像缓存了某些东西一样。我被告知在 SSMS 中执行 SP 之前使用以下两行 SQL:
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
Run Code Online (Sandbox Code Playgroud)
当我使用上面的两行代码运行 SP 时,SP 在大约 8 秒内完成。但是,这真的给了我真正的执行时间(就像我从应用程序运行它一样)?我怎么知道?
在 SSMS 中测试存储过程时,有时会说#someTempTable____________________000000000000005B] (someField)
etc上缺少索引
当我像这样将它们添加到 sp 时:
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[#someTable] ([someField])
GO
Run Code Online (Sandbox Code Playgroud)
我似乎从未看到速度提高。所以,我经常不添加这样的索引。我应该什么时候添加这样的索引?
我最近在一个非常慢的存储过程中工作(运行需要 5 分钟)。我做了一个非常小的调整:
declare @tempTable table
(
...
)
insert into @tempTable
select .....
Run Code Online (Sandbox Code Playgroud)
到
select ... into #tempTable from someTable
Run Code Online (Sandbox Code Playgroud)
然后脚本在大约 2 秒内运行。什么可以解释这个时差?
虽然数据库备份文件只有 2GB,但即使在 x64 12G RAM、i7 机器上,恢复也可能需要 15-20 分钟。当我备份从不同数据库制作的类似大小的备份文件时,恢复会在 3 秒内完成。备份文件只包含一个备份集(我总是检查覆盖现有数据选项)。在其他较慢的机器上,恢复需要更长的时间。
什么可能导致恢复需要这么长时间?