我们有一个包含 2.5 亿条记录(唯一的 15 位数字。聚集唯一索引列)的表,平均每天至少会被 0.7 到 90 万个请求查询。
我们有多个应用程序访问此表。每个应用程序将尝试将 500,000 条数据与这 2.6 亿条记录进行比较。
我们的应用程序将向这个大表添加更多数据,这实际上减慢了其他应用程序的查询速度。
我们如何提高查询的性能?我们如何维护这张表?分区吗? 环境:Win 2K8R2,SQL 2K8R2,64GB RAM,双处理器8核
我们有一个包含 2.5 亿条记录(唯一的 15 位数字。聚集唯一索引列)的表,平均每天至少会被 0.7 到 90 万个请求查询。
我们有多个应用程序访问此表。每个应用程序将尝试将 500,000 条数据与这 2.6 亿条记录进行比较。
我们的应用程序将向这个大表添加更多数据,这实际上减慢了其他应用程序的查询速度。
我们如何提高查询的性能?我们如何维护这张表?分区吗? 环境:Win 2K8R2,SQL 2K8R2,64GB RAM,双处理器8核
如果多个应用程序只是试图比较数据,那么我相信这些不会写入表,缓存记录也应该有所帮助。还有一种叫做分片的技术,不幸的是 SQL 服务器没有提供它。但是 codeplex 上有一个库为 SQL Server 提供了这样的功能。它基本上试图平衡数据库上的负载。
我还没有测试过,但应该值得一试。如果你愿意,你可以在这里看到它http://enzosqlshard.codeplex.com/
在您感兴趣的数据子集(行和列)上创建临时表。临时表应该比原始源表小得多,并且可以轻松索引(如果需要)。
要创建临时表,您可以使用代码(未经测试),例如:
-- copy records from last month to temporary table
INSERT INTO
#my_temporary_table
SELECT
*
FROM
er101_acct_order_dtl WITH (NOLOCK)
WHERE
er101_upd_date_iso > DATEADD(month, -1, GETDATE())
-- run other queries on temporary table (which can be indexed)
SELECT TOP 100
*
FROM
#my_temporary_table
ORDER BY
er101_upd_date_iso DESC
优点:
轻松处理任何数据子集。易于管理——它是临时的,它是桌子。不影响整体系统性能,如视图。临时表可以被索引。缺点:
它是数据的快照——但这对于临时查询来说可能已经足够了。
与上面类似,但创建视图而不是临时表。
您可以在您感兴趣的数据子集上创建视图或索引视图,并在视图上运行查询——它应该只包含比整个表小得多的有趣数据子集。
优点:
很容易做到。它是最新的源数据。缺点:
仅适用于已定义的数据子集。对于具有高更新率的大型表可能效率低下。没那么容易管理。会影响整体系统性能。选择所有列在大表上运行星查询(SELECT * FROM)不是好事......
如果您有大列(如长字符串),则需要花费大量时间从磁盘读取它们并通过网络传递。
我会尝试将 * 替换为您真正需要的列名。
或者,如果您需要所有列,请尝试将查询重写为:
;WITH recs AS (
SELECT TOP 100
id as rec_id -- select primary key only
FROM
er101_acct_order_dtl
ORDER BY
er101_upd_date_iso DESC
)
SELECT
*
FROM
er101_acct_order_dtl
WHERE
id = rec.rec_id
ORDER BY
er101_upd_date_iso DESC
可以加快查询速度的最后一件事是允许带有表提示 WITH (NOLOCK) 的脏读。
您可以将事务隔离级别设置为未提交,而不是提示:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED