【问题标题】:Performance Help on 144 million row table query SQL - Very slow1.44亿行表查询SQL的性能帮助——非常慢
【发布时间】:2015-07-10 10:23:46
【问题描述】:

我的查询需要帮助。该表有 1.44 亿行,这是一个阶段表(我们从另一个表插入数据)。我之前没有索引,而且这项工作已经运行了 9 个多小时。我用多列(AdvertiserName、MediaPlanName、MediaPlanNumber、CreativeDescription)向该表添加了非聚集索引,因为这种组合使其独一无二。但是即使现在执行计划显示的是表扫描,而不是非聚集索引扫描,性能也没有提高。

这是下面的查询,使用 SSIS 将数据汇总到 csv 文件需要很长时间。如何提高此查询的性能?请帮忙!! 运行需要很长时间。 :(

SELECT
    AdvertiserName,
    AdvertiserID,
    MediaPlanNumber,
    MediaPlanName,
    PublishingSiteName,
    SiteName,
    Week_Begin_Monday,
    CreativeDescription,
    SUM(CAST(ViewCount AS BIGINT)) ViewCount,
    SUM(CAST(ClickCount AS BIGINT)) ClickCount,
    Media,
    Segment_Name,
    Segment_CD,
    Group_Name,
    Group_CD,
    Channel,
    LOB,
    Creative_Message,
    Creative_Category,
    Creative_Type,
    SUM(GRP) GRP,
    Intended_Delivery_Screen

FROM Stage_MM240(NOLOCK)
GROUP BY    AdvertiserName,
            AdvertiserID,
            MediaPlanNumber,
            MediaPlanName,
            PublishingSiteName,
            SiteName,
            Week_Begin_Monday,
            CreativeDescription,
            Media,
            Segment_Name,
            Segment_CD,
            Group_Name,
            Group_CD,
            Channel,
            LOB,
            Creative_Message,
            Creative_Category,
            Creative_Type,
            Intended_Delivery_Screen

【问题讨论】:

  • 如果( AdvertiserName,MediaPlanName,MediaPlanNumber, CreativeDescription) 使一行唯一并且您将这些列包含在您的分组依据中,那么每个组不会只包含 1 行吗?
  • 您好 FuzzyTree,感谢您回答我的问题。是的,对于所有其他列,它不再是唯一的。那么我应该在所有列上创建索引吗?我迷路了,不知道该怎么办?
  • 您在寻找特定范围的行吗?或来自这些行的数据?您能否通过其中的 WHERE 或 LIMIT 最小化查询选择和读取的数据量?
  • 您的表中似乎有很多信息(除了行数)。也许你应该考虑normalization

标签: sql sql-server performance large-data


【解决方案1】:

如果没有 WHERE 子句,最快的执行总是通过表扫描。如果它使用除唯一聚集索引(基本上是 PK)以外的任何索引,它会使磁盘访问次数翻倍。

我建议您尝试限制要读取的数据。如果你不能,你只需要等待......

【讨论】:

  • 或者购买更快的硬件,尤其是磁盘。
【解决方案2】:

普通索引在这种情况下没有帮助,因为没有 where 条件来限制行, 您或许应该尝试探索以下其中一项:
1.使用MAXDOP参数来利用并行度
2. 如果您使用的是 SSIS,请尝试将这些语句替换为 BULK INSERT 命令
3. 试试看columnstore indexes,因为它利用了压缩,所以特别适合批量读取和大数据
4. 尝试在非聚集索引中使用 INCLUDE 子句。覆盖索引可用于以与查询结果集所需的顺序相同的顺序物理维护数据,从而减少以后对 SORT 操作的需求(我不会选择此选项)

【讨论】:

    猜你喜欢
    • 2021-04-21
    • 2023-02-24
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    相关资源
    最近更新 更多