MSSQL 使用MSSM查询很快,但用网页查询很慢问题

探讨了ASP.NET调用SQL存储过程速度慢的问题,分析可能是由于存储过程计划缓存导致,提供了重新编译存储过程、修改参数和使用临时表等解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近遇到一个问题,两个页面查询非常慢,需要30~40秒,而相同的代码通过Microsoft SQL Server Management Studio或者VS的SQL查询工具查询却能秒出数据,感到非常奇怪。

如果修改存储过程,短时段内恢复正常,过一段时间又重新出现问题,大概是存储过程计划缓存的问题,可以试下重新编译存储过程:

exec sp_recompile @objname='存储过程名称'

ASP.NET调用SQL后台存储过程时,有时突然就变得很慢,在后台直接执行存储过程没问题,但在前台调用存储过程时就是很慢,而且在前台调用成功后,再次调用还是一样的慢,但更新一下存储过程再调用就很快了。但这始终不能彻底解决问题,过段时间又会出来同样的问题。

如果判定是缓存的问题解决办法可以参考下面的方法:

方法一:在可能比较耗时的语句后面加上option(recompile)

方法二:强制编译存储过程

SQL Server 提供三种重新编译存储过程的方法:

(1)、sp_recompile 系统存储过程强制在下次运行存储过程时进行重新编译。

  示例:exec sp_recompile 存储过程名

(2)、创建存储过程时在其定义中指定 WITH RECOMPILE 选项,表明 SQL Server 将不对该存储过程计划进行高速缓存;该存储过程将在每次执行时都重新编译。

  示例:Create Proc 存储过程名 WITH RECOMPILE AS 参数

(3)、在执行存储过程时指定 WITH RECOMPILE 选项,可强制对存储过程进行重新编译。仅当所提供的参数不典型,或者自创建该存储过程后数据发生显著更改时才应使用此选项。

  示例:存储过程名 WITH RECOMPILE

如果无法判定是缓存引起的可以试试下面的这样办法:

把执行Procedure 的参数直接拼好传递给查询语句执行代替从代码中直接调用存储过程。

创建 CommandType = CommandType.Text 的 DbCommand 对象,再调用


ExecuteDataSet("EXEC PRO_SFDAB008_QUERY '',null,'2009-01-01','2014-01-01' ");

把执行Procedure 的参数直接拼好传递。

实际问题的最终解决办法是将原来的一个查询分拆开,使用了临时表,问题解决。

<think>嗯,用户提到想找关于MSSM的教程和学习资料。首先,我需要确认MSSM的具体含义,因为可能有不同的解释。在技术领域,MSSM常见的缩写有几个可能性,比如在数据库管理系统中,MSSM可能指Manual Segment Space Management,即手动段空间管理,这是Oracle数据库中的一种存储管理方式。另外,MSSM也可能代表其他领域的术语,比如某些软件或模型。 根据用户提供的引用内容,特别是引用[1]提到了将字典管理的SYSTEM表空间迁移到本地管理,这说明用户可能是在Oracle数据库的上下文中提问。因此,这里的MSSM应该是指Manual Segment Space Management,即手动段空间管理,与自动段空间管理(ASSM)相对。 接下来,我需要考虑用户可能的需求。用户可能正在学习Oracle数据库管理,特别是在存储结构、表空间管理方面,需要了解如何手动管理段空间,或者需要将现有的MSSM转换为ASSM。因此,用户需要相关的教程和资料来指导操作步骤、原理以及最佳实践。 然后,我需要检查现有的引用内容是否提供了相关的信息。引用[1]确实涉及到了表空间迁移,这可能与MSSM相关,但并没有直接提供教程链接。引用[2]和引用[3]则关于数据导入导出和Maven配置,可能与当前问题无关。因此,可能需要建议用户查找Oracle官方文档或推荐一些权威的学习平台。 另外,用户可能对MSSM的概念、工作原理、优缺点以及实际操作示例感兴趣。因此,在回答中需要涵盖这些方面,并推荐相应的学习资源,如Oracle官方文档、技术博客、在线课程等。 需要确认是否有拼写错误或缩写误解的可能性,比如是否用户指的是MSSQL(Microsoft SQL Server)或其他术语。但结合引用内容中的Oracle相关内容,MSSM更可能指Oracle的段空间管理。因此,可以基于这个假设进行回答。 最后,生成相关问题以帮助用户进一步探索MSSM的相关主题,比如与ASSM的区别、性能比较、实际应用中的选择考量等。</think>关于MSSM(Manual Segment Space Management,手动段空间管理)的学习资料和教程,以下是整理的信息: ### MSSM核心概念 MSSM是Oracle数据库中管理段空间的传统方式,通过`FREELIST`链表跟踪数据块的空闲空间[^1]。与ASSM(自动段空间管理)相比,MSSM需要DBA手动调整存储参数。 ### 学习资源推荐 1. **官方文档** - Oracle Database Concepts手册第15章《Storage and Space Management》 - Oracle Database Administrator’s Guide中《Managing Tablespaces》章节 2. **实践教程** ```sql -- 创建MSSM表空间示例 CREATE TABLESPACE mssm_ts DATAFILE '/u01/oradata/mssm01.dbf' SIZE 100M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT MANUAL; ``` 3. **关键参数说明** - `FREELISTS`:控制并发插入的链表数量 - `PCTFREE`:预留空间比例(默认10%) - `INITRANS`:初始事务槽数量 ### MSSM与ASSM对比 | 特性 | MSSM | ASSM | |--------------|-----------------------|-----------------------| | 空间管理 | 手动维护`FREELIST` | 自动位图管理 | | 适用场景 | 高并发OLTP | 数据仓库/混合负载 | | 碎片控制 | 需要定期重组 | 自动空间合并 | ### 典型应用场景 1. 需要精确控制块级存储结构的系统 2. 使用`RAC`环境时减少全局争用 3. 特定第三方应用兼容性要求
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello World,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值