【问题标题】:Indexing and Partitioning: Improving SqlServer 2008 R2 query performance索引和分区:提高 SqlServer 2008 R2 查询性能
【发布时间】:2017-04-04 12:46:05
【问题描述】:

我在“SQL Server 2008 R2”中有一个数据库,它的大小约为 5 TB,并且它的大小不断增长。 我在 tbl1 上运行具有数亿行的简单查询时遇到了一些问题:

select x1,x2,x3
from tbl1
where date > '2017-04-03 00:00:00.000' and date < '2017-04-04 00:00:00.000'
      and mid = 300

此查询大约需要 20 秒。 我在 datemid 列上有两个非聚集索引,这个查询利用了它们。

在此表中提高selectinsert 性能的最佳想法是什么? (如自动分区)

我正在使用Entity Framework,所以我不想更改表的名称或将其分区为一些不同的名称。

感谢您的帮助。

【问题讨论】:

  • 您使用的是哪个版本的sql-server-2008-r2?
  • @MikeNakis:Microsoft SQL Server 企业版(64 位)
  • 哦,旗舰。你很幸运,因为这个版本在分区方面做了所有事情。

标签: sql-server indexing sql-server-2008-r2 database-performance partitioning


【解决方案1】:

您提出问题的方式让我相信您的印象是分区是您必须手动执行的操作,即将一个表拆分为多个表,每个表具有不同的名称。

事实并非如此。

使用 ms-sql-server,您只需发出 CREATE PARTITION 命令即可对表和索引进行分区。因此,继续查找它们:

CREATE PARTITION FUNCTION

CREATE PARTITION SCHEME

因此,在您的情况下,我假设您将在 date 列上进行分区,可能将每年放在不同的分区上,甚至可能将每个月放在不同的分区上。

但是,请注意,您的问题可能是 X-Y problem 的情况。您遇到的困难似乎与性能有关。您似乎已经得出结论,为了解决您的问题,您需要做的是分区,因此您发布了一个关于分区的问题。我正在回答您的问题,但很可能您的问题不是分区。可能是很多其他事情,例如锁定:如果您的表非常大并且不断增长,那么可能发生的情况是不断向其中添加行,因此可能是您的 SELECT s 正在与您的 INSERTs 争夺对表的访问权限。

【讨论】:

  • 感谢您的回答。关于你说的 X-Y 问题:我有一个服务,inserts 将数据放入数据库。当我停止服务时,问题仍然存在。
  • 当我在Management Studio 中检查execution plan 时,一切看起来都很好(关于使用索引和...)。但实际上执行查询的方式并不像我预期的那样,需要太多时间。
  • 最后,我根据“日期”将两张很大的表分成了几块,问题就彻底解决了。
  • 很高兴听到这个消息,@pedram!
猜你喜欢
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 2010-11-17
  • 1970-01-01
相关资源
最近更新 更多