标签: azure-sql-database

SQL Azure 碎片/数据库大小

我有一个在 SQL Azure 上运行的数据库,目前为 280mb。它是我们即将投入生产的系统的测试数据库,因此数据经常被批量删除然后重新创建。

当我在 SQL Azure 上使用“复制”功能时,它创建的新数据库只有 156mb。当运行查询以显示每个表使用了多少数据时,看起来每个表的大小几乎是过去的一半。

我已经确定这将归结为数据碎片,但我的问题是我能做些什么?微软似乎没有对数据本身进行任何维护,而且由于它是按使用付费的模式,当我没有 1GB 的数据时,我最终会达到 1GB 的限制!

作为参考,这是我运行以显示表大小的查询:

select sys.objects.name, (reserved_page_count * 8.0 / 1024)
from sys.dm_db_partition_stats, sys.objects
where sys.dm_db_partition_stats.object_id = sys.objects.object_id
Run Code Online (Sandbox Code Playgroud)

fragmentation azure-sql-database

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

计算组内的中值

我有一个存储过程,它计算10 分钟间隔内请求/响应周期的平均持续时间。这很有效,适合我绘制图表的需求。我接下来想做的是计算值......我怀疑我需要一个子查询,但不知道如何完成这个。

SELECT dateadd(minute, 10 + (datediff(minute, 0, [Started]) / 10) * 10, 0) AS [Time]
     ,AVG(CASE WHEN Duration is null OR Duration = 0 
              THEN null ELSE Duration 
          END) AS [Mean Response Time]
FROM [Application].[Exchange] WITH (NOLOCK)
WHERE [Started] >= '24 Oct 2012' AND [Started] < '25 Oct 2012'
GROUP BY dateadd(minute, 10 + (datediff(minute, 0, [Started]) / 10) * 10, 0) 
ORDER BY dateadd(minute, 10 + (datediff(minute, 0, [Started]) / 10) * …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server aggregate t-sql azure-sql-database

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

从 Linux(但不是从 Windows)执行存储过程几分钟时,FreeTDS/Azure 中出现 SQL-08S01 错误

在 Linux(Ubuntu 和 CentOS)上执行从 Perl/DBI/ODBC/FreeTDS 到 SQL Azure 的存储过程时出现此错误:

[unixODBC][FreeTDS][SQL Server]Read from the server failed (SQL-08S01)
Run Code Online (Sandbox Code Playgroud)

在连接到同一个 SQL Azure 数据库的 Windows(ODBC/本机)上运行相同的 Perl 脚本时,我没有收到此错误,虽然该过程需要几分钟才能运行,但它确实完成了。显然是完全不同的客户端/驱动程序环境,但它们都使用相同的 SQL Azure 数据库,并且 Perl 脚本本身没有区别。两种 Perl 环境应该相似,但显然客户端/驱动程序会有所不同。

失败的行很简单 - 一个没有参数的过程,它从临时表中获取数据并处理它 - 在 Linux 调用失败时,SQL Azure 上的环境与我从 Windows 测试调用时没有显着不同(它当临时表加载了某些数据并从 Linux 调用时,它是完全可重现的):

$dbh->do("EXEC procname;") or die $DBI::errstr ;
Run Code Online (Sandbox Code Playgroud)

我的搜索表明这是某种连接问题或超时。

我正在努力提高 proc 性能,但未在 Linux 机器上设置超时(因此应默认为 0)。

我能做些什么来阻止这个错误?

这是来自 FreeTDS 的错误运行的日志:

util.c:156:Changed query state from IDLE to QUERYING
write.c:140:tds_put_string converting 27 bytes of "EXEC DWTOOLS.LoadFromStage;"
write.c:168:tds_put_string wrote 54 bytes
util.c:156:Changed query …
Run Code Online (Sandbox Code Playgroud)

sql-server freetds azure-sql-database

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

在 Azure 中使用 GUID 作为主键?

我想使用 GUID,因为它们是可移植的,并且可以更轻松地使用多个数据库。但是由于存在性能问题,这可能不是一个好主意?虽然我发现了一个 MS 博客条目,其中另有说明:http : //blogs.msdn.com/b/cbiyikoglu/archive/2012/05/17/id-generation-in-federations-identity-sequences-and-guids -唯一标识符.aspx

我已经阅读了一种替代方法,其中 datetime2 列用作聚集索引,Guid 用作 PK。因为我的大多数表格都有一个CreatedAtUtc列,这对我来说应该是一个可行的选择。但这真的有用吗?

所以我的问题是我是否应该使用 GUID 来获得可移植性,或者是否有更好的解决方案?

(使用 GUID,我还可以在我的代码中创建 Id 并在提交之前做更多的事情)。我还创建了一个 COMB 生成器,它应该比常规 GUID 更适合 MSSQL。

sql-server azure-sql-database

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

使用 LIKE '%ABC%' QUERY 提高 SQL 性能

我知道使用 LIKE '%ABC%' 查询不会使用索引,并且几乎没有什么可以更改查询来改进这一点,但是如何才能更快地执行?在此阶段,我们无法将查询更改为使用全文索引。

一些背景...

我们将 Azure VM(注意:不是 Azure SQL,而是运行在 Windows 2012 上的 SQL Server)中的系统作为第二个位置以提供额外的弹性(离线备份),并使用基本服务器规范“构建”了一个 SQL 服务器。在我们的旧平台上执行 LIKE 查询需要 2 秒,而在这个 Azure 平台上需要 10 秒。

这显然是服务器规范的限制,但是我可以做些什么来改进呢?

我可以在查询运行期间看到 CPU 峰值,因此“更快”的 azure cpu 似乎会有所帮助,但要知道这些数字也可能具有误导性!

所以我的问题是,我需要专注于改进 CPU,还是不止于此?

有问题的数据库在磁盘上只有 300mb,被查询的表有大约 160k 行,所以它无论如何都不大。

请让我知道我是否在这里吠错了树,或者我是否需要先检查其他任何东西?

SQL 服务器是带有 SQL Server 2014 Std 的 Windows 2012 R2,并且是按照 Azure SQL 性能指南(即专用条带驱动器上的数据)构建的。

编辑
根据要求,这是我正在测试的查询:

SELECT Name
FROM Users
WHERE Name like '%ABC%'
Run Code Online (Sandbox Code Playgroud)

就是这样。这里没有什么复杂的,只是从一个小数据库中检索数据!

顺便说一句,此查询需要 10 秒才能运行,而添加子句 'AND Description like '%ABC%' 将时间减少到 6s?

编辑 2

好的,在评论中的反馈之后有更多信息......

我已经关注了这个页面的信息:http : //www.sqlskills.com/blogs/paul/wait-statistics-or-please-tell-me-where-it-hurts/

我已经运行了显示的查询,这些是显示的结果: …

performance sql-server t-sql azure-sql-database query-performance

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

SQLPackage:在没有用户的情况下导入或导出 SQL Azure BACPAC

我知道如何使用SQLpackage.exe. 我可以从 SQL Azure 导出并创建 bacpac。我也可以通过SQLPackage.exe.

我想在没有数据库中的用户的情况下导出或导入。用户正在阻止正常导入失败。

导入数据库时​​出错:无法导入包。

错误 SQL72014 无法授予、拒绝或删除特殊角色的权限 在此处输入图片说明

我无法在导出之前删除用户,也无法将其从导入中排除。

目前我们必须备份数据库,在 SQLAzure 上恢复它,删除第二个数据库上的使用,然后从恢复的数据库创建一个 bacpac。

我该如何解决这个问题?我可以在我的 sqlpackage 中使用IgnoreUserSettingsObjects吗?我尝试使用参数但它失败了

sql-server azure-sql-database bacpac

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

为给定的外键值生成唯一的增量 ID

免责声明:这个问题最初是在 SO 上被问到的,但在那里并没有太大的吸引力,所以我在这里尝试,希望它对 DBA 更有趣......


我们正在开发一个电子商务系统,在该系统中我们汇总来自不同卖家的订单。正如您可以轻松想象的那样,我们有一个Order包含所有卖家订单数据的表格。每个卖家都有一个唯一的AccountID,它是Order表中的外键。

我们希望为进入系统的每个订单生成一个订单号,以便对于给定的卖家(和给定AccountID),这些订单号正在创建一个序列(第一个订单获得 1,然后是 2,然后是 3 等)。

我们已经尝试了几种解决方案,但它们有我们想要避免的缺点。所有这些都在触发器中:

ALTER TRIGGER [dbo].[Trigger_Order_UpdateAccountOrderNumber] 
   ON [dbo].[Order]
   AFTER INSERT
BEGIN
     ...
END
Run Code Online (Sandbox Code Playgroud)

我们的解决方案 1是:

UPDATE
    [Order]
SET
    AccountOrderNumber = o.AccountOrderNumber
FROM
(
    SELECT
        OrderID,
        AccountOrderNumber =
            ISNULL((SELECT TOP 1 AccountOrderNumber FROM [Order] WHERE AccountID = i.AccountID ORDER BY AccountOrderNumber DESC), 1) +
            (ROW_NUMBER() OVER (PARTITION BY i.AccountID ORDER BY i.OrderID))
    FROM
        inserted AS i
) AS o
WHERE [Order].OrderID …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql azure-sql-database

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

如何将 BACPAC 文件导入 Azure SQL 并覆盖现有数据库?

假设我有一个名为 MyDatabase 的本地数据库。我想将它移动到 Azure SQL 并替换当前驻留在那里的名为 MyDatabase 的现有数据库。我知道如何在本地创建 BACPAC 文件。我知道如何将 BACPAC 导入到我的 Azure 存储帐户。但是,一旦 BACPAC 位于 Azure 存储中,我不知道使用存储中的副本覆盖现有 MyDatabase 数据库的首选方法。我可以导入 BACPAC 文件并创建第二个数据库,然后删除第一个,并重命名刚刚导入的数据库。但是,这样做是最好的还是首选的方式?

sql-server azure-sql-database

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

表有 14 GB 的未使用空间 - 如何缩小表大小

我使用以下脚本从我的数据库中收集数据,即 Azure 上的 SQL Server。

-- Script to run against database to gather metrics

CREATE TABLE #SpaceUsed (name sysname,rows bigint,reserved sysname,data sysname,index_size sysname,unused sysname)

DECLARE @Counter int 
DECLARE @Max int 
DECLARE @Table sysname

SELECT  name, IDENTITY(int,1,1) ROWID 
INTO       #TableCollection 
FROM    sysobjects 
WHERE xtype = 'U' 
ORDER BY lower(name)

SET @Counter = 1 
SET @Max = (SELECT Max(ROWID) FROM #TableCollection)

WHILE (@Counter <= @Max) 
    BEGIN 
        SET @Table = (SELECT name FROM #TableCollection WHERE ROWID = @Counter) 
        INSERT INTO #SpaceUsed 
        EXECUTE sp_spaceused …
Run Code Online (Sandbox Code Playgroud)

sql-server database-size azure-sql-database

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

为什么我不定期运行“索引重组”?

到目前为止,我尝试了多次索引重组查询。它们看起来像这样:

ALTER INDEX ALL ON TableName REORGANIZE
Run Code Online (Sandbox Code Playgroud)

这样的查询可能需要几个小时,但它看起来不会干扰其他数据库操作。对于某些表,它的影响几乎为零,但对于某些表,它实际上节省了 15% 的整体数据库空间。

如果我每周左右对所有索引运行此查询会怎样?有什么理由不这样做吗?

index sql-server disk-space azure-sql-database

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