SQL大表的性能改进

时间:2014-08-18 20:59:19

标签: sql sql-server

我在SQL服务器中有260列表。当我们运行“从表中选择计数(*)”时,它几乎需要5-6才能获得计数。表包含关闭的90-100百万条记录,包含260列,其中50%以上的列包含NULL。除此之外,用户还可以从UI构建动态sql查询到表,因此搜索90-100万条记录将需要时间来返回结果。有没有办法改进SQL表上的查找功能,其中过滤条件可以是任何东西,任何1建议我最快的方式获取25GB数据的聚合数据.Ui应该被绞死或超时

4 个答案:

答案 0 :(得分:1)

调查horizontal partitioning。如果您可以强制用户将分区键放入谓词中,这实际上只会帮助查询性能。

尝试垂直分区,将一个260列的表拆分为多个列数较少的表。将所有通常需要的值放在一个表中。查询将仅引用包含所需列的表。这将为每页提供更多行,即每个查询的页数更少。

你有很多的NULL。 Sparse columns可能会有所帮助,但会计算您的百分比,因为如果不合适可能会造成伤害。对此有SO个问题。

如果数据库经常运行类似的查询,则过滤的索引和过滤的统计信息可能很有用。

答案 1 :(得分:0)

让我感动的是:

  1. [SQL Server 2012+]如果您使用的是SQL Server 2012,则可以使用新的Columnstore Indexes
  2. [SQL Server 2005+]如果要过滤文本列,可以使用Full-Text Search
  3. 如果您在某些列中经常应用某些功能(例如,列的SOUNDEX),则可以创建PERSISTED COMPUTED COLUMN,以便不必每次都计算此值。
  4. 使用临时表(索引的表会更好)减少要处理的行数。

  5. @Twelfth评论非常好:

    "我认为您需要创建一个ETL流程并开始将其更改为具有维度的事实表。"

答案 2 :(得分:0)

正如大家在评论中所述,您需要分析一些查询并查看哪些索引对您有所帮助。如果您的查询执行了大量搜索,则可以使用MSSQL服务器的全文搜索功能。 Here你会找到一个很好的例子。

答案 3 :(得分:0)

将我的评论改为答案......

您正在从记录这些9千万至1亿条记录的交易世界转变为数据仓库方案,您现在正在尝试对您拥有的信息进行切片,切块和分析。这不是一个简单的解决方案,但是你可能会达到当前系统可扩展到的极限。

在过去的工作中,我有几(6)个数据字段属于每个记录,这些数据字段几乎都是自由文本,并根据数据的生成位置随机填充(它们是搜索查询,人们正在输入他们基本上会输入的内容在谷歌)。有这样的6个字段...我创建了一个dim_text表,它在这6个表中的任何一个表中取出每个条目并用整数替换它。这给我留下了一个包含两列text_ID和text的表。每当用户在这6列中的任何一列中搜索特定条目时,我都会搜索我对此类查询进行优化(索引)的dim_search表,以返回与我想要的查询匹配的整数...我会接受整数并搜索6个字段中整数的所有occourence。搜索为这种类型的自由文本搜索高度优化的1个表,然后在主表中查询整数的实例比在此自由文本字段中搜索6个字段快得多。

我还会为您的公共聚合创建聚合表(如果您更喜欢该术语,则报告表)。您的业​​务设置将确定有很多选项...例如,如果每一行都是销售发票上的项目,并且您需要按日期显示销售额......最好按发票汇总总销售额并将其保存到表中,然后当用户想要按天计算总计时,会在发票的聚合上运行聚合以按天确定总计(因此您'部分'提前聚合了数据)。

希望这是有道理的......我确信在这里我需要进行多次编辑以澄清答案。