代码之家  ›  专栏  ›  技术社区  ›  OMG Ponies

索引视图与表上的索引

  •  25
  • OMG Ponies  · 技术社区  · 15 年前

    我有下表

    EVENT_LOG :

    EVENT_ID: pk, int, not null
    TYPEID: fk, int, not null
    CATEGORYID: fk, int, null
    SOURCE: varchar(255), null
    DESCRIPTION: varchar(4000), null
    CREATED: datetime, null
    

    我们一直在创建一个报告,结果发现性能很差。除了聚集索引之外,没有任何索引。我们可以创建它们,但是因为这个表写的比读取的要多——所以存在一个权衡性能的问题。对于报告,我倾向于将索引放在每一列上,因为需要在源和描述列中搜索子字符串。

    我们想知道 indexed view (也称为物化视图)是一个选项,其中索引视图将包含 事件日志 表,但在视图上创建了适当的索引。这会使我们获得报告的性能,而不影响对 事件日志 桌子?

    5 回复  |  直到 13 年前
        1
  •  25
  •   Eric    15 年前

    索引视图将导致与列上的索引相同的问题,因为索引视图需要 with schemabinding 它直接与表绑定,不允许您以任何方式、形状或形式更改/更改该表的架构。这包括调整列的大小(例如-从 varchar(50) varchar(255) ,更改列的数据类型(例如-from double decimal(18,5) 等等。我见过他们因为这个事实而引起很多意想不到的头痛。

    我的建议是设置一个存储过程或SSIS包,它将为您创建一个每小时运行一次的报告表。这样,你就可以从中找到爱的地狱,享受它所带来的所有性能优势。我不愿从一个实时的、正在进行的系统中报告。实际上,我还没有看到有必要这样做的情况。出于报告的目的,一小时前的信息通常完全足以完成工作。

        2
  •  3
  •   Eric Petroelje    15 年前

    我认为它仍然会影响性能,因为具体化视图上的索引需要在某个时间点进行更新——但它可能不需要与表写入同步。

    就我个人而言,我会把索引放在表上,并自己测量写性能。你可以猜测索引的写入速度会有多慢,但在你真正测量它之前,你只是在猜测。这可能根本不会有什么明显的区别。

        3
  •  3
  •   Talasila    14 年前

    “需要在源&description列中搜索子字符串。”

    在varchar()列上搜索子字符串时,SQL Server不会使用任何索引。(即使复制表并创建索引) 如果在搜索字符串的开头使用了通配符,则不会使用索引。

    我想,如果需要在“source”和“description”中搜索子字符串,最好创建一个全文索引。

    所以我的建议是在varchar()列上创建一个全文索引,并手动进行更改跟踪,并且在没有dml的情况下大约每小时运行一次。这将减少INSERT语句的负载

        4
  •  1
  •   Jaimal Chohan    15 年前

    如果你经常写信给别人,就不会这样了,因为在你的物化视图中,索引的性能成本是你的。物化视图更多地用于不经常更改的数据。

        5
  •  1
  •   AMissico    14 年前

    我也遇到了类似的问题。决定根据DBA的建议添加多列索引。在我的开发机器和服务器上(具有DBA权限),写入和报告的性能比在单个列上创建索引快得多(17倍)。为什么,我不知道,因为我不是DBA,但我知道基础知识,有时这有助于你看穿森林/树木。因此,我同意EricPertroelje的观点,您必须添加索引并测量写入性能,甚至测量读取性能。