sql - 对于大量记录来说,动态 sql 存储过程是一件坏事吗?

标签 sql sql-server tsql stored-procedures

我有一个包含近 800,000 条记录的表,我目前正在使用动态 sql 在后端生成查询。前端是一个搜索页面,它需要大约 20 个参数,并且根据是否选择了参数,它会在基本查询中添加一个“AND ...”。我很好奇动态 sql 是否是正确的方法(似乎不是,因为它运行缓慢)。我正在考虑使用我的所有数据创建一个非规范化表。这是一个好主意还是我应该一起构建查询而不是使用动态 sql 逐个构建它。最后一件事,有没有办法加快动态sql?

最佳答案

与动态 SQL 相比,您的索引(或缺乏索引)更有可能导致速度变慢。

执行计划是什么样的?在 SSMS 中执行相同的查询时是否很慢?当它在存储过程中时呢?

如果您的表是未编入索引的堆,那么随着记录数量的增加,它的性能会很差 - 这与查询无关,并且动态查询实际上可以随着表性质的变化而表现得更好,因为动态查询更有可能拥有它的查询计划不在缓存中时重新评估。这通常不是问题(我不会将其归类为动态查询的设计优势),除非在系统的早期阶段,此时 SP 尚未重新编译,但统计信息和查询计划已过时,但是数据刚刚发生了翻天覆地的变化。

还不是静态的。我有动态查询,但它没有给出任何优化。如果我使用静态查询运行它并给出建议,应用它们会影响动态查询吗? – Xaisoft(41 分钟前)

是的,除非您分析了工作负载文件,否则可能不会分析动态查询 (EXEC (@sql))。 – Cade Roux(33 分钟前)

当您跨多个连接的表进行搜索查询时,带有索引的列需要是搜索列以及主键/外键列 - 但这取决于各种表的基数。调谐分析器应该显示这一点。 – Cade Roux(22 分钟前)

关于sql - 对于大量记录来说,动态 sql 存储过程是一件坏事吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/317725/

相关文章:

使用 coalesce 优化 MySQL 查询

SQL - 将两列合并成一个逗号分隔的列表

sql - 存储过程需要参数 : Parameter is shown in profiler . ..?

sql-server - T-SQL 中的 VLOOKUP 式范围查找

sql - 向查询添加 INNER JOIN 不应增加返回的行数,对吗?

sql - 多列(每种类型一列)与单个 TEXT/Clob 列

sql - 具有输入和输出参数的存储过程

SQL Server 2008 - CAST 到 nvarchar 不起作用

sql-server - 如何创建损坏的 .bak 文件进行测试?

sql-server - SQL Server - 将多个查询结果合并为一个结果集