我们正面临从使用 Microsoft 企业库 3.0 的 .net 应用程序(Windows 服务)调用的存储过程的性能问题。 SQL Server 过程只是检查记录是否存在,如果不存在,则将记录插入表中,否则就返回它们。
表格中有以下列:
create table AlarmLog
(
Id bigint
MessageId int
MessageTime datetime
ControllerId int
InterfaceHardwareId int
IDType int
MapId int
RelatedEmployeeId int
RelatedCardId int
);
Id 列是主键,上面有聚集索引。
作为业务规则,在插入记录时,我们需要确保组合(MessageId、MessageTime、ControllerId、InterfaceHardwareId、IDType、MapId)是唯一的。因此,我们设置了一个 if exists 条件来检查组合是否已经存在。此条件检查需要很长时间。
我们已尝试在 MessageId、MessageTime、ControllerId、InterfaceHardwareId、IDType、MapId 上添加非聚集索引。
在我们实验室的测试服务器上,有大约 30,00,000 条记录,即使条件合适,它使用相同的 .net 服务每分钟插入大约 400 多行的速度也相当快。我们还尝试添加上述非聚集索引,并发现了一些明显的改进。
在生产服务器上,大约有 300,000 多条记录,当我们从 .net 应用程序(Windows 服务)中按条件逐行插入时,它每分钟仅插入 10 到 20 行。如果我们删除条件检查,那么插入的行数将达到每分钟 300 到 400 多行。我们还尝试添加/删除上述非聚集索引,但没有发现任何明显的改进。
因此,我们暂时将其禁用。有趣的是,如果我们从 SQL Server Management Studio 运行存储过程以插入 1 条记录,没有问题,我们还检查了实际的执行计划,没有发生表扫描,也没有存储过程占用任何时间。
其他性能调整事件重建、重组、更新统计信息、存储过程重新编译和参数嗅探也已尝试。但是,似乎没有任何效果。
我们现在处于修复状态。我们无法找到任何替代方案。如果您能为我们提供一些建议/指导,将会很有帮助。
提前致谢。 乌贾尔
最佳答案
添加唯一的约束而不是索引,如:
alter table AlarmLog add constraint uq_alarmlog_row unique (
MessageId, MessageTime, ControllerId,
InterfaceHardwareId, IDType, MapId);
这将自动拒绝插入值与该列组合完全匹配的新行。
这在性能方面也应该很快。无需调用过程来运行先前的 select 并检查值是否存在。
只需运行一个简单的 SQL insert 即可解决问题。
关于c# - 存储过程中 SQL Server 查询的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50630874/
我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
由于fast-stemmer的问题,我很难安装我想要的任何rubygem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=
我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha