Questions tagged «partitioning»

将数据库表分为多个段以提高性能或可管理性。

2
SQL Server 2008-分区和聚集索引
因此,请允许我说我对数据库的设计没有完全控制权,因此,对于本场景而言,无法更改当前系统的许多方面。 关于我们应该如何重新考虑设计方面的评论可能是正确的,但无济于事:) 我有一个很大的表,大约150个字段宽,大约600m行,它驱动着大量的进程。这是在数据仓库的情况下,因此我们在计划的加载过程之外没有任何更新/插入,因此它的索引很高。 已做出尝试对该表进行分区的决定,并且我对索引已分区表有些担忧。我没有分区方面的经验,因此不胜感激任何输入或链接。我在BOL或msdn上找不到具体的位置。 目前我们群集上一个领域,我们称之为IncidentKey这是一个varchar(50),而不是唯一的-我们可以1-100记录与同一之间有IK(没有意见,请)。我们经常会在旧IncidentKey记录上获取新数据,因此也不是连续的。 我了解我需要IncidentDate在群集索引键中包含分区字段,以使分区正常工作。我在想IncidentKey, IncidentDate。 问题是,如果“新”分区中的记录应该在聚簇索引中“旧”分区中的记录之前,则聚簇索引的机制将如何在分区表的2部分键上工作? 例如,我有5条记录: IncidentKey Date ABC123 1/1/2010 ABC123 7/1/2010 ABC123 1/1/2011 XYZ999 1/1/2010 XYZ999 7/1/2010 如果我得到一条新记录,ABC123, 2/1/2011它将需要在聚集索引BEFORE中 XYZ999, 1/1/2010。这是如何运作的? 我假设使用碎片和指针,但是找不到具有双部分键的分区表上非分区聚簇索引的物理存储和配置的任何信息。

1
sys.partition.rows列的准确性如何?
系统视图sys.partitions具有“行”列,该列是给定分区中的总行数。对于未分区的表(或者只有一个分区,这取决于您的外观),此列给出了表中的行数。 我很好奇此列的准确性,以及是否可以使用它代替SELECT COUNT(1) FROM TableName。我做过一些实验,创建一个表并添加几千行,删除几百行,再添加几千个,等等,而且这种情况一直没有解决。但是,我有一张表,约有7亿行和几个索引。sys.partitions聚簇索引的行再次停滞不前,但是其他索引显示出一些细微的变化(+ -20k)。 有谁知道该行的计算方式以及它的准确性是否与所显示的相同?

4
表分区以存档数据
场景: 两个数据库:DB_A和DB_Archive,其中有一个非常大的表,称为tableA。 每天都会将超过60天的记录从DB_A中删除,并移至DB_Archive,主要是为了使事情“分开”,因为过去两个月的记录都在DB_A上严重查询了tableA。 我想摆脱此过程,因为它速度慢且消耗大量资源。我正在考虑在date_Column上使用分区功能在DB_A上实现表分区,并在一个分区上存储所有<2个月的记录,在另一个分区上存储所有> 2个月的记录。我的问题: 如果我有2个不同的数据库,这种情况的行为会如何?如果我在tableA中查询记录> getdate()-30,它将读取归档分区吗? 我以为我也必须对索引进行分区,对吗? 我要如何处理明天我的分区函数将“更改”的事实,我的意思是,如果今天创建该函数(7月2日,其范围将是5月2日,但是明天将是5月3日)。我可以创建动态分区功能吗?

1
磁盘文件删除和清除的影响
我有一个经常更新的表,其中包含2.4亿行(并且还在不断增长)。每三小时插入150万行,删除150万行。当我将群集移至SSD时,此批量插入(使用副本)的时间从22分钟减少到2.3分钟。删除时间也得到了改善。我计划每两个小时或每小时进行一次批量更新。 尽管现在的性能(在SSD之后)可以与更频繁的更新兼容,但我已经读到了一些有关由于有限的NAND耐久性和写入放大而导致SSD死亡的恐怖故事。由于固态硬盘价格昂贵,我想将其淘汰时间推向未来。因此,我的问题是:磁盘文件在删除和随后的清理中到底发生了什么?我猜有两个磁盘写操作,一个将行标记为已删除,另一个在清理时将其标记为可覆盖。如果不是在每个批量插入/删除操作中对创建和删除表进行分区而不是删除和清理,我将使SSD的磨损最小化吗?


1
如何解释这些DMV的结果以帮助我评估分区策略?
版本:SQL Server 2008 R2 Enterprise Edtn。(10.50.4000) 为了评估我们的分区策略,我编写了此查询来获取针对分区上索引的访问方法(从广义上讲,尽管我要消除堆)。当我将注意力集中在分区表上时,我相信我需要研究range_scan_count并且singleton_lookup_count在概念化方面遇到了困难。 SELECT t.name AS table_name, i.name AS index_name, ios.partition_number, leaf_insert_count, leaf_delete_count, leaf_update_count, leaf_ghost_count, range_scan_count, singleton_lookup_count, page_latch_wait_count , page_latch_wait_in_ms, row_lock_count , page_lock_count, row_lock_wait_in_ms , page_lock_wait_in_ms, page_io_latch_wait_count , page_io_latch_wait_in_ms FROM sys.dm_db_partition_stats ps JOIN sys.tables t ON ps.object_id = t.object_id JOIN sys.schemas s ON t.schema_id = s.schema_id …

1
在PostgreSQL中存储和查询滚动数据
我将大量的天气模型数据放入PostgreSQL数据库中。该计算机具有8个内核和16 GB的RAM。我正在使用PostGIS 2.1运行PostgreSQL 9.3。每个表都有不同的天气数据(温度,露点,风等)。每个表将有6-7列:纬度,经度,点几何,高程,与模型相关的日期时间,以及1-2个感兴趣的数据值。将首先根据时间和海拔高度查询边界框的数据。每个表大约有145,757,360行(比现在不再重要的数据将被删除)。我粗略估计,每个表的大小(不含索引)约为10 GB。(这是52字节的数据加上每行23字节的开销)。当新模型数据可用时,数据将定期更新/插入。注意: 因此,我正在研究以下两个计划: 只需按(日期时间,海拔高度)进行索引和聚类,并为点几何图形添加附加索引。运行常规的cron作业,该作业将删除旧行,运行真空/分析并重新进行集群。 按日期时间进行分区,然后对每个表按高度进行聚类,并按索引对几何进行索引。运行常规的cron作业以添加新表,然后删除旧表。 进一步, 因此,我知道删除表的效率更高,而删除和清理则更为有效。但是我会否看到性能提升? 当所有表将被均匀更新和选择直到不相关而被删除之前,分区是否合适(文档指出,当只选择其中的几个分区时,分区效果最佳)? 交付数据时,选择的速度会比聚集索引快吗?如果一次发出多个请求,答案是否会改变? 谢谢。我希望我收集所有需要的数据。如果没有,请告诉我,我将其添加。

2
多列vs少表-性能明智
是的,我知道数据规范化应该是我的首要任务。 我有一个表,65列存储与列车辆数据:used_vehicle,color,doors,mileage,price等等,总共65。 现在,我可以除以和有一个Vehicle表,VehicleInterior,VehicleExterior,VehicleTechnical,VehicleExtra(全一到一个与主Vehicle表)。 假设我有大约500万行(车辆)。 在SELECT带有WHERE子句的情况下:搜索效果会更好(两种情况至少都在上索引IDs): Vehicle 65列的表格或 Vehicle表与JOINS其他四个表(均具有500万行)一起返回与Vehicle?相关的所有数据 (根据数据库引擎,考虑PostgreSQL和/或MySQL)。 真的很欣赏您以前的经验中得到的任何详细见解吗?

1
分区约束不适用于涉及按时间戳进行分区的表的联接
我有一个分区表结构,如: CREATE TABLE measurements ( sensor_id bigint, tx timestamp, measurement int ); CREATE TABLE measurements_201201( CHECK (tx >= '2012-01-01 00:00:00'::timestamp without time zone AND tx < ('2012-01-01 00:00:00'::timestamp without time zone + '1 mon'::interval)) )INHERITS (measurements); CREATE INDEX ON measurements_201201(sensor_id); CREATE INDEX ON measurements_201201(tx); CREATE INDEX ON measurements_201201(sensor_id, tx); .... …

3
为什么不分区?
什么时候不希望对数据库进行分区?(考虑MySQL分区) 就我而言 我将从几百万行开始,应该从那里开始。 字符字段上的主键用作最频繁的查询约束(并且查找也很频繁-至少每秒几次)。 主键将被散列为分区键 将对上述频繁查询中提取的每一行进行更新 频率较低的查询(针对日期列或其他查询)将需要访问所有分区 即使到最后一点,查找也不是并行运行的,因此在所有情况下,这都是胜利吗?分区的不利之处是什么?为什么至少在查看百万条记录时,每个人都默认不使用它? 更新-我选择了zgguy的答案,但请注意,我在自己的研究结果中添加了自己的答案,其中包括指向对我非常有用的类似问题的非常好的答案的链接。

2
SQL Server 2008 R2分区-相同的文件组,1个文件,2个partition_numbers-帮助
我是从Brent Ozar指南中学到的,这是我第一次使用SQL Server进行分区,这真是太棒了:) 几次我遇到了一个奇怪的情况。当我跑步时: SELECT * FROM ph.FileGroupDetail ORDER BY partition_number Go 有一个相同的文件组两次显示2个不同的partition_number,一个正确地在末尾显示一个范围值,另一个在开始时显示一个空range_value。 点击这里放大图片 几个问题: 这是怎么回事,我哪里出错了? 我该如何解决该问题,这意味着如何在开始时摆脱一个分区,因为开始时我已经有一个空分区。 我曾尝试删除文件(在为空时工作)和文件组,但文件组说无法删除。 有人可以解释一下这是怎么发生的以及如何摆脱第2分区条目吗?

2
在单个文件组上分区
我的数据库中有一些非常大的表,但是这些数据的很大一部分是“旧的”。 由于无法控制的情况,我不允许删除此“旧”数据。另一个限制是我无法修改数据库,这意味着要向其中添加文件组。按照目前的状态,所有内容都驻留在PRIMARY文件组中。 我正在考虑将这些表划分为几个分区,例如“新”,“旧”,“已归档”等。为此,我确实有一个“状态”列。 考虑到上述情况和限制,我想知道分区在这里是否有意义。换句话说,如果以这种方式对我的表进行分区,但是所有分区都位于同一文件组上,SQL Server将足够聪明地在我的“新”数据所驻留的基础文件中找到该特殊区域,并且不会碰到具有“旧”数据的区域? 换句话说,如果我的数据中有80%是“旧的”。SQL Server是否具有避免访问100%的基础文件并仅访问20%的包含“新”数据的机制(假设,当然,我WHERE在查询的子句中指定了分区列)。 我想回答这个问题,就需要了解如何在内部实现分区。我感谢任何指示。

1
MySQL分区:在分区数量和每个分区的大小之间是否存在性能折衷?
我有一张大表(几亿行),我想对其进行有效的分区。我的问题是分区大小和分区数量之间是否需要权衡。据我了解,对分区中使用的列的大多数查询都将更快,因为该查询(对于大多数查询)仅需要在适用于该查询的分区中进行搜索。因此,为了最大程度地提高效率,应该将一个大表划分为最大数量的分区,从而使每个分区尽可能小。对于MySQL,这意味着1024个分区。但是拥有大量分区是否存在性能缺陷?是的,如何找到最佳的分区数? 注意:关于stackoverflow已经有一个类似的问题,但是只有一个答案(从我的角度来看)未达到要求。所以我将以自己的方式陈述这个问题...希望更清楚

4
SQL Server分区-分区密钥使用什么?
我从来没有使用过SQL Server分区,但是目前我面临着设计数据库的问题,而这些数据库可能需要它的支持。该系统用于优惠券。优惠券应定期发行,通常每六周发行一次,尽管也会临时发行(例如特殊活动)。有1500万客户,每次发行活动,每个客户将获得6种不同的优惠券类型,总共提供9000万个优惠券实例。我们需要跟踪优惠券实例的兑换数据并保持6个月,尽管通常优惠券仅有效6周。任何兑换无效优惠券的请求都不会到达数据库,因为直到POS都将对其进行验证。 在六个月的时间内,我们需要在Coupon Instance表中存储3.6亿行,在Redemption表中存储多达7200万行(假设最大20%的赎回率)。我感觉这些数字对于单个分区来说太大了吗? 我的问题是-用作分区键是什么?一个明显的候选者将是通过发行事件,给出大约6个分区。但是然后我认为,即使那样也会使分区大小太大而无法实现最佳性能?是否可以通过两个密钥进行划分,例如按发布事件+客户ID的最后一位数字?因此逻辑将是: If issuance event = 1 and last digit of customer id < 5 then Store in partition 1 Else if issuance event = 1 and last digit of customer id >4 then Store in partition 2 Else if issuance event =2 and last digit of …

2
如何防止SELECT上的分区列存储死锁
我在SQL Server 2016中拥有三个群集列存储索引(CCI)表。所有这些CCI都基于租户ID处于同一分区方案中。最近,而且前后矛盾,我在从联接到这些表的简单选择语句中陷入僵局。死锁的示例查询: SELECT TOP 33 r.tenantid FROM Table_r r INNER JOIN Table_cm cm ON r.MyKey=cm.MyKey INNER JOIN Table_pe pe ON r.MyKey=pe.MyKey WHERE r.TenantId = 69 AND pe.TenantId = 69 AND cm.TenantId = 69 错误信息: 事务(进程ID 56)与另一个进程在通用的可等待对象资源上处于死锁状态,并且被选择为死锁牺牲品。重新运行事务。 线索: 如果查询使用CCI以外的其他索引,则不会死锁。 如果删除三个tenantid过滤器中的两个,则不会死锁。 如果我选择前32位或更低,则不会死锁。 如果添加OPTION(MAXDOP 1),则不会死锁。 我可以在混乱的PROD副本,PROD只读次要副本和PROD本身中对此进行复制。 我无法在DEV或INT中复制此行为。 如果我将WITH(NOLOCK)添加到所有3个表联接中,它仍然会死锁 查询自身会死锁。当没有其他活动进程时,它将死锁。 没有并行性的查询计划不会死锁 死锁XML在这里 我们的PROD版本: …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.