Questions tagged «storage»

有关数据库数据的持久存储的问题。

2
在大表中填充新列的最佳方法?
我们在Postgres中有一个2.2 GB的表,其中有7,801,611行。我们正在向其中添加一个uuid / guid列,我想知道填充该列的最佳方法是什么(因为我们想向其添加NOT NULL约束)。 如果我正确理解Postgres,从技术上讲,更新就是删除和插入,因此这基本上是在重建整个2.2 GB表。另外,我们有一个正在运行的奴隶,所以我们不想让它落后。 有什么方法比编写随时间推移缓慢填充脚本的方法更好?

1
在RAW分区上创建数据库不再有效?
我正在尝试使用两个原始分区(即未格式化的分区)创建数据库。 Microsoft Docs声明您可以执行此操作,您只需要指定原始分区的驱动器号即可,如下所示: CREATE DATABASE DirectDevice ON (NAME = DirectDevice_system, FILENAME = 'S:') LOG ON (NAME = DirectDevice_log, FILENAME = 'T:') 但是,SQL Server 2017返回此错误: 消息5170,级别16,状态4,第1行 无法创建文件'S:',因为它已经存在。更改文件路径或文件名,然后重试该操作。 消息1802,级别16,状态4,第1行 CREATE DATABASE失败。列出的某些文件名无法创建。检查相关错误。 文档的相关部分指出: 如果文件位于原始分区上,则os_file_name必须仅指定现有原始分区的驱动器号。每个原始分区上只能创建一个数据文件。 是的,驱动器S:和T:都是我系统中确实存在的未格式化原始分区: DISKPART>详细分区 分区4 类型:ebd0a0a2-b9e5-4433-87c0-68b6b72699c7 隐藏:否 必填:否 属性:0000000000000000 字节偏移量:999934656512 卷### Ltr标签Fs类型尺寸状态信息 ---------- --- -------------- ----- ---------- ------- ---- ----- -------- …

4
SQL Server发生I / O请求的时间超过15秒
在生产SQL Server上,我们具有以下配置: 将3台Dell PowerEdge R630服务器组合到可用性组中,所有3台都连接到单个RAID SAN存储单元,该存储单元是一个RAID阵列 有时,在PRIMARY上,我们会看到类似以下的消息: SQL Server在数据库ID 8 的文件[F:\ Data \ MyDatabase.mdf]中遇到11次I / O请求,而这些请求花费的时间超过15秒。OS文件句柄为0x0000000000001FBC。 最新的长I / O的偏移量是:0x000004295d0000。 长I / O的持续时间为:37397毫秒。 我们是性能故障排除的新手 解决与存储相关的特定问题的最常用方法或最佳做法是什么?必须使用哪些性能计数器,工具,监视器,应用程序等来缩小此类消息的根本原因?可能会有可以提供帮助的扩展事件,或者某种审计/日志记录?

5
尝试回收未使用的空间会导致已用空间在SQL Server中显着增加
我在生产数据库中有一个表,该表的大小为525 GB,其中383 GB未使用: 我想回收一些空间,但是在弄乱生产数据库之前,我正在用较少数据的测试数据库中的同一表上测试一些策略。该表有一个类似的问题: 有关表的一些信息: 填充因子设置为0 大约有30列 列之一是图像类型的LOB,它存储的文件大小从几KB到几百MB不等 该表没有任何与之相关的假设索引 服务器正在运行SQL Server 2017(RTM-GDR)(KB4505224)-14.0.2027.2(X64)。数据库正在使用SIMPLE恢复模型。 我尝试过的一些事情: 重建索引: ALTER INDEX ALL ON dbo.MyTable REBUILD。这产生的影响可以忽略不计。 重组索引:ALTER INDEX ALL ON dbo.MyTable REORGANIZE WITH(LOB_COMPACTION = ON)。这产生的影响可以忽略不计。 将LOB列复制到另一个表,删除该列,重新创建该列,然后将数据复制回(如本文章中概述的:释放未使用的空间SQL Server表)。这减少了未使用的空间,但似乎只是将其转换为已用空间: 使用了bcp实用程序来导出表,截断表并重新加载表(如本文所述:如何为表释放未使用的空间)。这也减少了未使用的空间,并将使用的空间增加到与上述图像相似的程度。 即使不建议这样做,我也尝试了DBCC SHRINKFILE和DBCC SHRINKDATABASE命令,但是它们对未使用的空间没有任何影响。 跑步 DBCC CLEANTABLE('myDB', 'dbo.myTable')并没有改变 在保持图像和文本数据类型以及将数据类型更改为varbinary(max)和varchar(max)之后,我都尝试了上述所有方法。 我尝试将数据导入到新数据库中的新表中,这也仅将未使用的空间转换为已用空间。我在这篇文章中概述了这种尝试的细节。 如果我期望这些结果,我不想在生产数据库上进行这些尝试,因此: 为什么将其中一些尝试之后的未使用空间仅转换为已用空间?我觉得我不太了解幕后发生的事情。 我还能做些其他事情来减少未使用的空间而不增加已使用的空间吗? 编辑:这是表的磁盘使用情况报告和脚本: SET ANSI_NULLS ON GO SET …

1
如何在PostgreSQL中存储一字节整数?
在PostgreSQL文档中,据说整数数据类型可以存储在2字节,4字节或8字节的空间中。数据库中表的一列包含一个一字节的整数值,我希望将其存储为一字节的数据类型。 在PostgreSQL中是否有扩展或使用一字节整数数据类型的方法? NUMERIC(1,0)是多少个字节?

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

4
驱动器与安装点?
以前的高级DBA在整个公司的每个SQL Server中为我们所有驱动器设置了安装点。新的高级DBA 感到震惊,因为他们想更改我们的标准(主要是我认为,因为他没有使用这些标准的经验)。 基于大量Internet搜索的结果,我找不到任何不使用装载点的原因(SQL Server 2000之后)。 有人知道Windows OS与此主题有关的限制吗? 我最近听到很多关于“操作系统无法识别挂载点”的说法。(不正确,基于我对我们使用的Windows Server版本的研究)。 是否有任何基于证据或经验的原因不将装载点用于SQL Server? 假设用完驱动器号对我们来说不是问题。 据我了解,挂载点对于隔离工作负载非常有用。 任何人都可以确认或驳斥我的理解,即挂载点实际上比每个数据文件,日志文件和tempdb一个驱动器更有效地隔离/隔离不同类型的数据和日志文件(系统数据库文件,用户数据库文件,tempDB)的工作负载?

1
高并发存储系统
想象一下您的需求是,您有3个巨大的表(结构化数据),每个表有300亿行(总大小为4TB),并且许多并发用户(远程LAN机器上的并行os线程)将需要读取一部分通过他们的SELELCT WHERE GROUPBY查询和高度并发的数据,例如,同时进行10,000次并发读取,并且用户也需要将这些数据高度并发地插入(不更新)数据到这些表中,例如2000个并发写入器(遍及数据中心LAN网络) 。用户可能希望尽快从该存储中读取和插入数据,每次读取和写入将发生在毫秒到1秒范围内。 您推荐什么技术来满足这种要求?是否有任何数据存储或键值存储可以做到这一点?不能选择云。 一些说明: 用户不必立即查看数据,最终的一致性是可以接受的。数据可以通过存储可以提供的任何驱动程序进行访问,而用户又仅仅是在数据中心的远程计算机上运行的线程。查询大多类似于SELECT WHERE GROUPBY。 数据采用表格格式,每行约60个字节。 我无法使用DynamoDB或类似解决方案的无云选项。我必须能够在数据中心内部托管它。 可以一直读取表中的所有数据,并且使用模式是不可预测的。没有联接或超长查询。不需要DR,但是需要合理的HA,但是不必花哨。每个读者都基于其where子句获得了一批行,而这些子句与行并不是真正相关。我们可能每行的长度可以固定,但是我希望存储层对此有所担心。 另外,我最大的担心是与并发读取一起发生的所有那些并发写入。 非常感谢您对此的见解。 更重要的是,我有三个表,每个表有300亿行包含不同的对象类型

1
有关SQL Server中varchar大小调整的当前最佳实践是什么?
从存储和性能的角度来看,我试图了解确定varchar列应为多少的最佳方法。 表现 从我的研究看来只有真正需要时才应使用varchar(max);也就是说,如果该列必须容纳8000个以上的字符,那么一个原因就是缺乏索引(尽管一般而言,我对varchar字段的索引有些怀疑。尽管我对DB原理还很陌生,所以也许这是没有根据的)和压缩(更多有关存储的问题)。实际上,一般而言,当执行varchar(n).... oversizing不好时,人们似乎只建议使用所需的内容,因为查询必须考虑最大可能的大小。但也有人指出,引擎将使用指示大小的一半作为数据的平均实际大小的估计值。这意味着应该从数据中确定平均大小是多少,将其加倍,并将其用作n。但是,对于变异性非常低但非零的数据,这意味着要比最大尺寸大2倍,这似乎很多,但也许不是吗?见识将不胜感激。 存储 在阅读了行内存储与行外存储的工作原理并记住实际存储仅限于实际数据之后,在我看来,实际上,n的选择对存储几乎没有影响(除了确保它足够大以容纳所有东西)。即使使用varchar(max)也不会对存储产生任何影响。相反,如果可能的话,目标可能是将每个数据行的实际大小限制为〜8000字节。那是对事物的准确阅读吗? 上下文 我们的某些客户数据有些波动,因此,我们通常将列的宽度设置为稍稍超出其宽度(例如,将这些列增加15-20%)。我想知道是否还有其他特殊考虑?例如,与我一起工作的某人告诉我使用2 ^ n-1的大小(尽管我发现没有证据表明这是事实....) 我说的是初始表的创建。客户将告诉我们,他们将开始向我们发送一个新表,并发送示例数据(或仅发送第一个生产数据集),我们将对其进行查看并最终创建一个表来保存数据。我们希望使这张表最终能够处理将来的进口以及样品中的进口商品。但是,某些行注定会变长,因此我们填充它们。 问题是多少,是否有技术准则?

1
用于快照一致性备份的存储快照-不同的数据和日志卷
我们正在vmware /共享存储环境中运行许多Linux VM,每个Linux VM都运行自己的postgreSQL实例(混合使用9.0和9.3)。当前,整个VM都位于单个根分区/卷上,使用基础VMFS卷的基于存储的快照进行备份/还原过程(以及复制到我们的DR站点),我们已经取得了巨大的成功(〜8年)。 由于我们的存储体系结构,将postgres WAL文件分离到一个非缓存的(主要是写入的)卷中会比较有利,这样可以减少我们在存储方面的缓存混乱。使用我们的存储(Nimble Storage),我们可以将两个卷都分配到一个保护/快照组,但是我无法从供应商处得出快照将在保护组中的所有卷上完全同时发生-可能会,但是总是有相隔毫秒的机会。 为此,我们进行了一些实验,所有实验都使用pg_bench尽可能快地将数据写入数据库。实验之后,我们恢复了快照的卷并启动了VM + postgres 快照数据和日志卷同时接近-结果:数据库已恢复 首先快照数据量,约1分钟后日志量-结果:数据库已恢复 首先是快照日志卷,之后是约1分钟的数据卷-结果:数据库已恢复 在WAL检查点将新数据写入数据文件之后,快照日志卷首先出现,数据量在大约3分钟后出现:结果:数据库已恢复 因此,测试似乎告诉我们,只要两个快照在卷级别上是一致的,并且相对紧密,就可以基于WAL / Log卷快照的时间获得数据库的一致副本。 我的问题:这样安全吗?我们在测试中缺少哪些极端情况?可能出什么问题? Postgres的文档表明这样做并不安全,但是测试似乎表明它非常健壮:http : //www.postgresql.org/docs/9.1/static/backup-file.html 如果您的数据库分布在多个文件系统中,则可能没有任何方法可以获取所有卷的完全同步的冻结快照。例如,如果数据文件和WAL日志位于不同的磁盘上,或者表空间位于不同的文件系统上,则由于快照必须同时进行,因此可能无法使用快照备份。在这种情况下,请务必仔细阅读文件系统文档,然后再使用一致快照技术。 注意:是的,我们知道其他确保其一致性的选项,例如将PostgreSQL置于热备份模式或使用我们存储的VMware集成来静默VM本身,但是我们正在寻找一种仅存储的解决方案以提高速度,便利性,对客户的影响为零。

2
升级到更好的存储后,检查点的等待时间增加
当我们从一个较早的全闪存阵列迁移到一个较新的全闪存阵列(不同但信誉良好的供应商)时,我们开始发现检查点期间SQL Sentry中的等待时间增加了。 版本:SQL Server 2012 Sp4 在我们的旧存储中,检查点期间的等待时间约为2k,“峰值”为2500,而在新存储中,峰值通常为10k,峰值接近50k。哨兵将我们更多地指向PAGEIOLATCH瓦蒂斯。做我们自己的分析,似乎是PAGEIOLATCH and PAGELATCH等待的组合。使用Perfmon,我们通常可以说检查点的页面越多,等待的时间就越多,但是在检查点期间我们只刷新了约125 mb。我们的工作量主要是写操作(主要是插入/更新)。 存储供应商向我们证明,在这些检查点事件期间,光纤通道直接连接的阵列在1毫秒内响应。HBA还确认阵列的编号。我们也不认为这是HBA排队的问题,因为队列深度从未超过8。我们还尝试了更新的HBA,将ZIO,执行限制和队列深度设置更改为无效。我们还将服务器的内存从500 GB增加到1 TB,没有任何变化。在检查点过程中,我们确实看到2-4个核心(共16个)峰值达到100%,但总体CPU约为20%。BIOS也设置为高性能。但是有趣的是,即使禁用了CPU,我们也确实看到它们通常处于C2睡眠状态,因此我们仍在研究为何睡眠状态超过C1。 我们可以看到,几乎所有等待都在数据页面上,偶尔的PFS为DCM页面类型。等待在用户数据库中,而不在tempdb中。我们还看到,等待是在多个数据页面上进行的,其中一些SPID在同一页面上等待。数据库设计确实有几个插入热点,但是旧存储采用了相同的设计。 运行此查询循环100次,我们能够捕获正在磁盘与内存上等待的SPID数量 SELECT [owt].[wait_type], count(*) as waitcount FROM sys.dm_os_waiting_tasks [owt] WHERE [owt].[wait_type] LIKE 'PAGE%' group by [owt].[wait_type] order by 1 GO 100 “好”的事情是,我们可以在具有相同模型阵列和相似服务器规格的性能环境中轻松重现该问题。对于任何其他地方或如何缩小问题的想法,我将不胜感激。现在,我们的下一个测试包括:带有更新的主板和更多CPU的新服务器;禁用SIOS数据保持器(即使旧存储中已安装该功能);不同的HBA品牌。 exec sp_Blitz @outputtype = 'markdown' 优先级5:可靠性:-危险的第三方模块-Sophos Limited-Sophos缓冲区溢出保护-SOPHOS〜2.DLL-已安装可疑的危险第三方模块。 优先级200:信息性:-群集节点-这是群集中的节点。-TraceFlag On-跟踪标记1117全局启用。-跟踪标记1118全局启用。-跟踪标记3226全局启用。 优先级200:许可:-正在使用的企业版功能* xxxxx-[xxxxxx]数据库正在使用压缩。如果将此数据库还原到Standard Edition Server上,则还原将在2016 SP1之前的版本上失败。* …

1
在SSD上将SQL Server 2012中的tempdb,mdf和ldf文件最佳放置?
我意识到这可能是一个非常开放的问题,答案可能会有所不同,但是在谈论SSD时,SQL Server 2012中的tempdb,mdf和ldf文件的最佳位置是什么? 在购买新产品之前,我有一个装有SQL Server 2012核心文件和tempdb的现有SSD,并且两个mdf / ldf都安装在7200rpm HDD上。然后,我购买了2个SSD,其初衷是将mdf放在另一个上,并将ldf放在另一个上。 但是,从更多内容来看,涉及SSD的mdf和ldf文件的单独物理磁盘实际上并不适用。正确? 所以,我在想以下几点: SSD 1-SQL Server 2012核心文件和Windows SSD 2-tempdb SSD 3-MDF和LDF 如果有所作为,它将只用于一个数据库,因此多个数据库之间不会有任何争用。 我的“思维”设置好还是只是浪费(即没有理由分开tempdb),而现在我有了一个额外的SSD可以在其他地方使用?

1
添加SPARSE使表更大
我有一个通用的日志表,大约有500万行。 有一个“强类型”字段存储事件类型,还有一堆“弱类型”列包含与事件相关的数据。也就是说,那些“错误输入”列的含义取决于事件的类型。 这些列定义为: USER_CHAR1 nvarchar(150) null, USER_CHAR2 nvarchar(150) null, USER_CHAR3 nvarchar(150) null, USER_CHAR4 nvarchar(150) null, USER_CHAR5 nvarchar(150) null, USER_INTEGER1 int null, USER_INTEGER2 int null, USER_INTEGER3 int null, USER_INTEGER4 int null, USER_INTEGER5 int null, USER_FLAG1 bit null, USER_FLAG2 bit null, USER_FLAG3 bit null, USER_FLAG4 bit null, USER_FLAG5 bit null, USER_FLOAT1 float …

2
一字节的“ char”类型在PostgreSQL中如何工作?
我经常看到人们在谈论"char"。我没用过 在文档中定义为 类型“ char”(请注意引号)与char(1)的不同之处在于,它仅使用一个字节的存储空间。在系统目录中内部使用它作为一种简单的枚举类型。 并进一步, "char" 1 byte single-byte internal type 那么,如果它是一个字节,则域是什么,您将如何使用它?它是签名的还是未签名的?在@Erwin Brandstetter的这篇文章中,他对此进行了阐述,但我仍然感到困惑。他正在使用ascii()和chr(),并提供了 SELECT i , chr(i)::"char" AS i_encoded , ascii(chr(i)::"char") AS i_decoded FROM generate_series(1,256) i; 这在10到11之间确实很奇怪。 i | i_encoded | i_decoded -----+-----------+----------- ... 8 | \x08 | 8 9 | | 9 10 | +| 10 | | -- …

1
SQL Server无法将NULL存储在固定长度的列中吗?
我在Oracle官方文档中遇到了以下声明: 在Microsoft SQL Server中,只有具有可变长度数据类型的列才能存储NULL值。创建允许固定长度数据类型为NULL的列时,该列将自动转换为系统可变长度数据类型... 我从未在SQL Server文档中阅读过此书,也从未经历过这样的事情。相反:在SQL Server中,固定长度的数据类型(例如int和float,还包括char)被大量使用,并且即使可以为NULL时也非常有效地存储。 这个Oracle声明背后有什么根据吗?

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.