可能的重复:
将大量数据发送到存储过程的技术
我经常遇到我想将一组 Id 作为参数传递给存储过程的情况。
例如,对于 GetCustomerAccounts 存储过程,客户端从列表中选择 20 个客户。然后我想将这 20 个客户 ID 传递给程序以返回他们的帐户。
目前我通过有一个参数表来解决这个问题。我用我的客户 ID 和单个 Guid ID 填充它。然后将此单个 Guid ID 传递给过程,然后该过程再次连接参数表。我不喜欢这样,因为它涉及多次访问数据库。
另一种可能性是在逗号分隔的 Varchar 参数中传递 Id。然后,存储过程可以将此字符串解析为临时表,然后针对该表进行联接。再次感觉非常讨厌。
有一个更好的方法吗?
我们的一位客户刚刚升级到新服务器。
对于一个特定的存储过程,第一次执行它需要三分钟的时间来运行。后续运行不到 1 秒。
这让我相信最初的三分钟主要用于计算执行计划。后续运行只需使用缓存的计划并立即运行。
在我们的测试数据库上,计算相同程序的计划大约需要 5 秒。
我在计划本身中没有看到任何可怕的东西 - 尽管我不认为它是相关的,因为计划显示了运行查询需要多长时间,而不是计算本身。
该服务器为 16 核,24 GB 内存。不会发生沉重的 CPU 或内存负载。
是什么导致仅在特定数据库上计算如此缓慢?
我可以采取哪些步骤来找出问题的原因?
编辑
所以我设法访问服务器并使用SET SHOWPLAN_XML ON运行查询。
我可以确认查询的 CompileTime 占用了查询执行时间的 99%。该StatementOptmEarlyAbortReason是“超时”,我们与他们的数据库副本的原因是MemoryLimitExceeded测试数据库。
我有一大堆需要创建的视图。其中许多视图依赖于其他视图。
如果我创建的视图依赖于尚未创建的视图,则会收到无效对象错误。
与其遍历整个过程并找出依赖关系,然后按照正确的顺序创建它们,有没有一种方法可以关闭此检查,直到创建所有视图?
视图安装后可以删除依赖视图,因此数据库可能处于视图存在依赖于不存在对象的状态。我需要它接受在创建过程中处于这种状态..