- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在一个遗留应用程序中遇到了巨大的性能问题。
有一个搜索表单,用户可以在其中搜索具有给定值的记录。结果行包含 10 列。然后 SP 返回在任何列中包含该值的任何行。
这个 SP 使用 8 个表,其中一些表有大约百万条记录。每一分钟我都会获得一个新记录。该 SP 也进行寻呼。执行此 SP 有时需要大约 40 秒。
我所做的是,我创建了一个新表并使用来自该 SP 的查询将所有记录放在那里,但没有条件。当其中一个源表中有新的更新或更新时,我使用触发器并更新这个新的“缓存”表。现在等待这个新表的结果只需 1-3 秒。
有人遇到过这样的事情吗?
我的一位同事说我最好使用 View ,但每次我都会进行 JOINS
。
你怎么看?还有别的办法吗?
最佳答案
临时表通常可以帮助您解决性能问题。一种方法可能是仅将您需要考虑的记录收集到临时表中,然后从连接到您未过滤的任何其他表的临时表中创建最终的选择语句。
例如,假设您要搜索的字段之一是 table1
中的 field1
。首先向表 #table1
中插入您正在寻找的具有 field1
值的记录:
select PrimaryKeyTable1, Field1, Field2, Field3, etc...
into #table1
from table1
where Field1 = 'Whatever you are looking for'
即使对于大表,这也应该相当快,尤其是当您在 Field1
上有索引时。您对每个带有搜索字段的表都执行此操作,以收集具有您正在搜索的相关记录的所有记录。
然后您还需要确保将任何记录插入到您的临时表中,这些记录可能具有对任何其他临时表的外键引用。因此,假设您还使用上述方法构建了一个表 #table2
,该表具有指向 table1
的外键,称为 PrimaryKeyTable1
。您将像这样插入这些记录:
Insert into #table1
(PrimaryKeyTable1, Field1, Field2, Field3, etc...)
select table1.PrimaryKeyTable1, table1.Field1, table1.Field2, table1.Field3, etc...
from table1
join #table2
on table1.PrimaryKeyTable1 = table2.PrimaryKeyTable1
where table1.PrimaryKeyTable1 not in
(Select PrimaryKeyTable1 from #table1)
现在您还将在 #table1
中找到与 #table2
中的记录相匹配的任何记录,其中包含符合搜索条件的记录。您对所有具有相关外键的临时表执行此操作。您执行插入的顺序很重要;在收集外键引用记录时,确保在最后一个插入语句之后不引用任何临时表。
然后您可以简单地执行最后的选择语句,将实际表替换为您构建的临时表并消除所有搜索字段数据的过滤器。根据您的查询结构,可能会有其他优化,但这是一般的想法。
如果您已经探索了所有索引选项,但仍然没有帮助,MS SQL Server 具有“更改跟踪”功能,可能对您构建缓存表有用。您启用数据库以进行更改跟踪并配置您希望跟踪的表。 SQL Server 然后在表上的每次更新、插入、删除时创建更改记录,然后让您查询自上次检查以来对记录所做的更改。这对于同步更改非常有用,并且比使用触发器更有效。它也比制作自己的跟踪表更容易管理。这是自 SQL Server 2005 以来的一项功能。
How to: Use SQL Server Change Tracking
更改跟踪仅捕获表的主键,让您查询哪些字段可能已被修改。然后您可以查询这些键上的表连接以获取当前数据。如果您希望它捕获数据,您也可以使用 Change Capture,但它需要更多的开销并且至少需要 SQL Server 2008 企业版。
关于sql-server-2008 - 创建用于缓存记录的 View 或新表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30422032/
本周我将在 Windows Server 2008 上设置一个专用的 SQL Server 2005 机器,并希望将其精简为尽可能简单,同时仍能发挥全部功能。 为此,“服务器核心”选项听起来很有吸引力
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭 8 年前。 Improve
我获取了 2014 版本数据库的备份,并尝试在另一台服务器中将其恢复到具有相同名称和登录名的数据库中。此 SQL Server 版本是 2016。 恢复备份文件时,出现此错误: TITLE: Micr
我获取了 2014 版本数据库的备份,并尝试在另一台服务器中将其恢复到具有相同名称和登录名的数据库中。此 SQL Server 版本是 2016。 恢复备份文件时,出现此错误: TITLE: Micr
TFS 是否提供任何增强的方法来存储对 sql server 数据库所做的更改,而不是使用它来对在数据库上执行的 sql 语句的文本文件进行版本控制? 或者我正在寻找的功能是否仅在第 3 方工具(如
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我即将将我的 SQL Server 2012 实例升级到 SQL Server 2014。 我已经克隆了主机 Windows VM 并将其重命名为 foo-2012至 foo-2014 . 重新启动时
我想为 SQL Server 登录授予对数据库的访问权限。我知道 sp_grantdbaccess,但它已被弃用。我可以改用什么以及如何检查登录名是否还没有访问数据库的权限? 场景:UserA 创建数
客户别无选择,只能在接下来的几天内从 sql server 2000 迁移到 2008。测试显示 2005 年的重要功能出现了 Not Acceptable 性能下降,但 2008 年却没有。好消息是
我有一个测试数据库,我需要将其导出到我们客户的测试环境中。 这将是一次性的工作。 我正在使用 SQL Server 2005(我的测试数据库是 SQL Server 2005 Express) 执行此
我需要将一个 CSV 文件导入到 mongoDB 不幸的是我遇到了以下错误: error connecting to host: could not connect to server: se
我以为 R2 是一个补丁/服务包。我一直在寻找下载,但没有看到。因此,我假设 R2 是一个新版本,并且我需要 sqlserver 2008 r2 的安装介质来进行升级? 另外,我需要为新许可证付费吗?
我无法使用 SQL Server Management Studio 连接到 SQL Server。 我有一个连接字符串: 我尝试通过在服务器名中输入 myIP、在登录名中输入 MyID、在密码中
我们希望使用 SQL Server 加密来加密数据库中的几个列。我们还需要在生产和测试环境之间传输数据。看来最好的解决方案是在生产和测试服务器上使用相同的主 key 、证书和对称 key ,以便我可以
有没有可以分析 SQL Server 数据库潜在问题的工具? 例如: a foreign key column that is not indexed 没有 FILL FACTOR 的 uniquei
我正在尝试从我的 SQL 2012 BI 版本建立复制,但我收到一条奇怪的错误消息! "You cannot create a publication from server 'X' because
如果您使用 SQL Server 身份验证 (2005),登录详细信息是否以明文形式通过网络发送? 最佳答案 如您所愿,安全无忧... 您可以相当轻松地配置 SSL,如果您没有受信任的证书,如果您强制
我想将数据从一个表复制到不同服务器之间的另一个表。 如果是在同一服务器和不同的数据库中,我使用了以下 SELECT * INTO DB1..TBL1 FROM DB2..TBL1 (to copy w
我希望得到一些帮助,因为我在这个问题上已经被困了 2 天了! 场景:我可以从我的开发计算机(和其他同事)连接到 SERVER\INSTANCE,但无法从另一个 SQL Server 连接。我得到的错误
我正在尝试从我的 SQL 2012 BI 版本建立复制,但我收到一条奇怪的错误消息! "You cannot create a publication from server 'X' because
我是一名优秀的程序员,十分优秀!