在sql server 2008中查询大表

时间:2013-02-18 06:33:47

标签: sql-server sql-server-2008 query-performance large-data

我们有一个包含2.5亿条记录的表格(唯一的15位数字。聚集的唯一索引列),平均每天至少会查询0.7到90万个请求。

我们有多个应用程序访问此表。每个应用程序将尝试将500,000个数据与这2.6亿个记录进行比较。

我们的应用程序会向此大表添加更多数据,这实际上会减慢对其他应用程序的查询速度。

我们如何改善查询的性能?我们怎样才能维护这张桌子?分区吗? 环境:赢取2K8R2,SQL 2K8R2,64GB RAM,双处理器8核

2 个答案:

答案 0 :(得分:0)

如果多个应用程序只是试图比较数据,那么我相信这些不会写入表格,缓存记录也应该有所帮助。还有一种称为分片的技术,遗憾的是SQL服务器并没有提供它。但是在Codeplex上有一个库,它为SQL Server提供了这样的功能。它基本上试图平衡数据库的负载。

我没有测试过,但值得一试。如果您愿意,可以在此处查看http://enzosqlshard.codeplex.com/

答案 1 :(得分:0)

1。使用临时表

在您感兴趣的数据的子集(行和列)上创建临时表。临时表应该比原始源表小得多,并且可以轻松索引(如果需要)。

要创建临时表,您可以使用代码(未经测试),如:

-- 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

优点:

易于处理任何数据子集。 易于管理 - 这是暂时的,它的表格。 不影响视图等整体系统性能。 临时表可以编入索引。 缺点:

它是数据的快照 - 但这对于即席查询来说可能已经足够了。

2。创建视图

与上面类似,但创建视图而不是临时表。

您可以对您感兴趣的数据子集创建视图或索引视图,并在视图上运行查询 - 这应该只包含比整个表小得多的有趣数据子集。

优点:

容易做到。 它与源数据保持同步。 缺点:

仅可用于已定义的数据子集。 对于具有高更新率的大型表而言可能效率低下。 管理起来不那么容易。 会影响整体系统性能。 选择所有列 在大桌子上运行星形查询(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)进行脏读。

您可以将事务隔离级别设置为读取uncommited:

,而不是提示
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED