是否有一个程序可以根据您的代码(例如C#)找到最佳的数据库索引?

是否有一个程序可以根据您的代码(例如C#)找到最佳的数据库索引?,c#,database,automation,C#,Database,Automation,我知道有些程序会根据数据库模式为您提供索引选择,但我找不到任何基于代码(即根据查询中访问最多的表)的程序。我的意思是,如果在C#中,您选择代码优先的方法,实体框架处理数据库,是否有人开始手动重新读取代码或观察服务器端对更优化索引的请求,或者您根本不在乎,因为EF对默认模式做得足够好 我只是没有找到它们,还是有一个巨大而明显的原因(除了不想向第三方披露您的代码之外)实际上没有 一个巨大而明显的原因是代码几乎不起作用。重要的是SQL查询和数据统计。不仅仅是查询本身,还包括它们运行的频率、它们做什么等

我知道有些程序会根据数据库模式为您提供索引选择,但我找不到任何基于代码(即根据查询中访问最多的表)的程序。我的意思是,如果在C#中,您选择代码优先的方法,实体框架处理数据库,是否有人开始手动重新读取代码或观察服务器端对更优化索引的请求,或者您根本不在乎,因为EF对默认模式做得足够好


我只是没有找到它们,还是有一个巨大而明显的原因(除了不想向第三方披露您的代码之外)实际上没有

一个巨大而明显的原因是代码几乎不起作用。重要的是SQL查询和数据统计。不仅仅是查询本身,还包括它们运行的频率、它们做什么等。每到午夜运行一次缓慢的报告查询与在工作时间从多台机器上运行几次的一般更新查询没有多大关系。第二种是导致阻塞和明显延迟的原因。除此之外,数据库服务于许多应用程序,需要针对所有应用程序进行优化。业务的优先级也不会与单个应用程序的优先级相同。数据库,特别是SQL Server,已经提供了优化工具。自90年代以来,SQLServer提供了一个查询分析器,可以测试并找到一个查询或一组查询的最佳索引。索引本身很昂贵,因此添加更多索引可能会导致额外的延迟。SQL Server还提供管理视图和SSMS报告,其中包含执行查询时查询引擎识别的缺失索引。顺便说一句,相同的查询,相同的索引在具有1000行的表和具有不同值分布的1M行的表上的行为将非常不同。一个包含1000个随机值的列看起来很适合索引,但是一个包含99000个相同值而只有1000个不同值的列几乎是无用的。这是您需要针对实际数据进行优化的另一个原因,您不能仅根据查询和测试数据进行优化。我认为这样做的方法是运行应用程序,例如在负载测试下,并在分析时生成一些流量。然后使用探查器跟踪进行优化。