标签: azure-sql-database

改变超大表上的列大小

我有一个包含 NVarChar(Max) 类型列的表。

在允许用户添加数据之前我没有采取很好的预防措施,所以现在我有超过 25 亿行,并且数据库变得超级大。

我正在尝试更改列以将大小更改为固定长度,其中应删除记录 > 该宽度。

这不是索引列。

我尝试过 LEN(Text)>width 但这是一个非常慢的函数,因为它会扫描数十亿行。

我们后来还尝试通过创建一个新表并将数据移到那里来将 Int 更改为 BigInt,但这需要一周左右的时间。

Alter Column 会冻结系统。

您能否提出任何其他方式或建议您认为最好的方法?

数据库托管在 Azure SQL 上

非常感谢 :)

sql-server azure-sql-database

6
推荐指数
2
解决办法
739
查看次数

大表的在线索引重建需要排他锁

我正在尝试在 Azure SQL 数据库上重建大表 (77GB) 的聚集索引。表上有高并发事务活动,因此我正在使用该ONLINE=ON选项。

这对于较小的表很有效;但是,当我在这个大表上运行它时,它似乎在表上使用了排他锁。我不得不在 5 分钟后停止它,因为所有事务活动都超时了。

来自 SPID 199 的会话:

ALTER INDEX PK_Customer ON [br].[Customer] 
REBUILD WITH (ONLINE = ON, RESUMABLE = ON);
Run Code Online (Sandbox Code Playgroud)

从另一个会话:

CL

在相同的结果中更进一步:

在此处输入图片说明

  • 对象 978102525 是聚集索引。
  • 对象 1125579048 是表。

在此处输入图片说明

我知道在线重建可以在过程开始和结束时锁定“短”持续时间。但是,这些锁定会持续几分钟,这并不完全是“短”持续时间。

附加信息

在重建运行时,我运行了SELECT * FROM sys.index_resumable_operations;但它返回了 0 行,就好像重建根本没有开始一样。

较小的表也有一个可能大于 900 字节的 PK,并且相同的ALTER语句在没有任何长时间阻塞的情况下工作,所以我认为它与 PK 大小无关。这些较小的表也有相似数量的nvarchar(max)列。我能想到的唯一真正的区别是这个表有更多的行。

表定义

这是 的完整定义br.Customer。没有外键或非聚集索引。

CREATE TABLE [br].[Customer](
    [Id] [bigint] NOT NULL,
    [ShopId] [nvarchar](450) NOT NULL,
    [accepts_marketing] [bit] NOT NULL,
    [address1] [nvarchar](max) MASKED WITH …
Run Code Online (Sandbox Code Playgroud)

sql-server clustered-index azure-sql-database index-maintenance online-operations

6
推荐指数
1
解决办法
460
查看次数

识别 SQL Azure 上未使用的索引

我有一个大型 SQL Azure 数据库(P6 大小接近 1TB)。我想清理/删除任何未使用的索引。在过去的 30 天里,我们捕获了以下 2 组信息。

参见:https : //gist.github.com/eoincampbell/3fe775d43e86ad342f9c6eba10f350f9

  • sys.dm_db_index_physical_statsjoin 到收集的索引统计数据sys.tablessys.schemas以及sys.indexes
  • 索引使用收集自 sys.dm_db_index_usage_stats

我对sys.dm_db_index_usage_stats. 从文档中不清楚何时/是否在 SQL Azure 环境中发生以下情况(与单实例 MSSQLServer 相比)。

https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-db-index-usage-stats-transact-sql?view=azuresqldb-current的每当 SQL Server (MSSQLSERVER) 服务启动时,计数器都会初始化为空。此外,无论何时分离或关闭数据库(例如,因为 AUTO_CLOSE 设置为 ON),与该数据库关联的所有行都将被删除。

这是我用于随后识别未使用索引的查询。它

  1. 获取数据库中所有索引的最新索引信息(812条记录)
  2. 获取所有索引的最新使用信息(558条记录)
  3. LEFT OUTER 将它们连接在一起
  4. 排除任何聚集/PK 索引
  5. 返回任何没有使用统计信息或任何用户读取统计信息为零的内容。

返回的总行数约为 219 行

这种方法看起来有效吗?

询问


WITH MostRecentStats (
    SchemaName, TableName, IndexName, IndexType, AllocUnitType, Pages, MostRecentAt
)
AS (
    SELECT      SchemaName, TableName, IndexName
                , IndexTypeDescription, AllocUnitTypeDescription
                , Max(PageCount) , …
Run Code Online (Sandbox Code Playgroud)

index sql-server database-size azure-sql-database index-maintenance

6
推荐指数
1
解决办法
322
查看次数

从生产复制数据库的最佳实践

目前,在发布我们应用程序的新主要或次要版本后,我们复制生产数据库并执行以下过程:

  1. 将生产数据库复制到测试服务器
  2. 混淆数据并设置测试用户
  3. 用混淆的新数据库切换旧的测试数据库
  4. 对开发数据库重复此操作。

这样做的目的是确保我们所有的环境尽可能彼此接近。这最初是一个手动过程,但由于越来越复杂,我们已经开始将其自动化。

但是,自动化这样的部署后过程的最佳方法是什么?我们目前的自动化是一个定制的 c# 程序 - 但是,SSIS 包是否更合适?或者是否有适合这项工作的工具?

sql-server best-practices azure-sql-database

5
推荐指数
1
解决办法
3441
查看次数

SQL Azure 未使用可用内存

我们使用的是 SQL Azure Premium P1,它带有 8GB 内存和 150 IOPS。几个小时以来,我们一直看到 SQL 查询超时(即使是相当简单的查询也需要时间)。

在 SQL Azure 的日志中,我们看到我们的物理读取 IOPS 在几分钟内从稳定的 5 IOPS 增加到大约 130,但我们在依赖 SQL Azure 的系统中的实际生产并没有增加。

在它跳到 130 IOPS 的那一刻,日志显示数据库内存使用量从非常稳定的 4.8GB 下降到 1GB 左右

我认为如果内存使用量下降,物理读取量增加是有道理的。

我查看了在服务器上执行的查询,但除了较慢的响应之外,没有发现任何异常。

我的问题是,即使有足够的内存可用,SQL Azure(或与此相关的 SQL 服务器)是否会从内存中删除内容并支持磁盘 IO,是否有任何原因。

sql-server azure-sql-database

5
推荐指数
1
解决办法
386
查看次数

为什么使用 Ola Hallengren 备份脚本对 Azure Blob 的一些完整 sql 备份锁定租约?

我正在使用 SQL Server 2012 并使用 Ola Hallengren 备份脚本备份到 Azure Blob。

一些备份是租用锁定的(例如模型),而其他备份则不是(例如 msdb)。它是不一致的,反之亦然,完全锁定或解锁。

为什么备份被租用锁定?我如何将它们全部解锁?

sql-server azure-sql-database ola-hallengren

5
推荐指数
1
解决办法
371
查看次数

将大型 SQL 数据库传输到 Azure (>300MB)

我想将本地 SQL 数据库传输到 Microsoft Azure。db中存储了文件,因此db大小约为300MB。

在 SQL Server Management Studio 中,我尝试了以下操作:

任务->生成脚本

我能够创建.sql脚本但无法加载它。

我也试过

任务->将数据库部署到 SQL Azure...

但大约 30 分钟后,它崩溃了。

有任何想法吗?

sql-server azure-sql-database

5
推荐指数
1
解决办法
963
查看次数

将 sql azure DB 导出为 bacpac 文件而不包含某些表的数据

当我从 sql server management studio 导出 sql azure 数据库作为数据层应用程序时,我可以选择勾选某些表,但这些表不包含在结果文件中。

我想导出这些表模式,但忽略它们的数据(本质上是导入空表)。对于所有其他表,我也想要数据。

有可能这样做吗?

sql-server backup azure-sql-database data-tier-application

5
推荐指数
1
解决办法
1728
查看次数

我们在 sys.databases 中的数据库的 Database_Id 与 DB_ID 的不匹配(“<我们的数据库”)

我们数据库的 sysdatabases 和 sys.databases 中的数据库 ID 是 4。

函数 DB_ID ( '<our database>' ) 为我们的数据库返回 5。此外,表 sys.dm_db_missing_index_details 中我们数据库的任何缺失索引数据也分配给 database_id 5。

在我看来,sys.databases 的 ID 应该是 5 而不是4。这让我很抓狂,让 sp_BlitzIndex 不起作用。

有谁知道为什么我的数据库 ID 在 SQL Azure 上的 sys.databases、sys.dm_db_missing_index_details 和 DB_ID() 之间不匹配?它真的搞砸了还是在 SQL Azure 中工作不同?

azure-sql-database

5
推荐指数
1
解决办法
878
查看次数

您如何列出 Sql Azure 的所有登录信息?

我可以使用哪些查询来列出 SQL Azure 中服务器和数据库的所有登录信息?

我试过跑步,select * from sys.sysusers但我猜这只是向用户展示

azure-sql-database users logins

5
推荐指数
1
解决办法
7699
查看次数