【问题标题】:Querying Large Table in sql server 2008 [duplicate]在sql server 2008中查询大表[重复]
【发布时间】:2013-02-02 13:15:57
【问题描述】:

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

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

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

我们如何提高查询的性能?我们如何维护这张表?分区吗? 环境:Win 2K8R2、SQL 2K8R2、64GB RAM、双处理器8核

【问题讨论】:

  • 查看查询执行计划的提示。
  • 它的增长速度很快——在第一段和第二段之间增加了 1000 万行! :-)
  • @Damien_The_Unbeliever 哈哈!
  • 还记得将您的大更新拆分为较小的批次,以防止锁升级。详情msdn.microsoft.com

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    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) 的脏读。

    您可以将事务隔离级别设置为未提交读取,而不是提示:

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    

    【讨论】:

    • 在不知道数据库架构和读/写查询的情况下建议更改事务隔离级别不是一个好主意。 NOLOCK 可以提供脏数据。请看这里stackoverflow.com
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 2011-08-26
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多