Questions tagged «azure-sql-database»

Azure SQL数据库是Microsoft的关系数据库即服务。该标签用于询问有关Azure SQL数据库的问题,而不是有关Azure VM中托管的SQL Server(使用azure-vm)的问题。

5
我可以添加一个忽略现有违规的唯一约束吗?
我有一个表,当前在列中有重复的值。 我无法删除这些错误的重复项,但我想防止添加其他非唯一值。 我可以创建一个UNIQUE不检查现有合规性的商品吗? 我尝试使用,NOCHECK但未成功。 在这种情况下,我有一个表将许可信息与“ CompanyName”相关联 编辑:具有相同的“ CompanyName”具有多个行是错误的数据,但此时我们不能删除或更新这些重复项。一种方法是让INSERTs使用存储过程,该存储过程将导致重复操作失败...如果可以让SQL自己检查唯一性,那将是更好的选择。 该数据通过公司名称查询。对于少数现有重复项,这将意味着将返回并显示多行...虽然这是错误的,但在我们的用例中是可以接受的。目的是防止将来发生这种情况。从评论看来,我似乎必须在存储过程中执行此逻辑。

4
EF Code First对所有字符串使用nvarchar(max)。这会损害查询性能吗?
我有一些使用“实体框架代码优先”创建的数据库;应用程序正常运行,总的来说,我对Code First的功能感到非常满意。根据需要,我首先是一名程序员,然后是DBA。我正在阅读有关DataAttributes的内容,以在C#中进一步描述我想要数据库做什么;我的问题是:将这些nvarchar(max)字符串放在表中会给我带来什么惩罚(请参见下面的示例)? 此特定表中有几列;在C#中,它们的定义如下: [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int ID { get; set; } public string Name { get; set; } public string Message { get; set; } public string Source { get; set; } public DateTime Generated { get; set; } public DateTime Written { get; set; } 我希望根据名称,来源,生成的和书面查询和/或排序。我希望“名称和源”的长度为0至50个字符,偶尔最多为150个字符。我希望此表的开头很小(<100k行),但随着时间的推移会显着增长(> 1m行)。显然,消息可能大小不一,可能不会被查询。 我想知道,是否将我的“名称”和“源”列定义为nvarchar(max)当我从未期望它们大于150个字符时对性能产生影响?

6
在整个数据库中更改GETDATE()的使用
我需要将本地SQL Server 2017数据库迁移到Azure SQL数据库,并且由于要克服很多限制,因此我面临一些挑战。 特别是,由于Azure SQL数据库仅在UTC时间(无时区)工作,并且我们需要本地时间,因此我们必须更改数据库中GETDATE() 所有地方的使用方式,事实证明,这比我预期的要多。 我创建了一个用户定义的函数,以获取在我的时区正确工作的本地时间: CREATE FUNCTION [dbo].[getlocaldate]() RETURNS datetime AS BEGIN DECLARE @D datetimeoffset; SET @D = CONVERT(datetimeoffset, SYSDATETIMEOFFSET()) AT TIME ZONE 'Pacific SA Standard Time'; RETURN(CONVERT(datetime,@D)); END 我遇到的问题是实际上GETDATE()在每个视图,存储过程,计算列,默认值,其他约束等中都使用此函数进行了更改。 实施此更改的最佳方法是什么? 我们正在受管实例的公开预览中。与仍然存在相同的问题GETDATE(),因此对解决此问题没有帮助。迁移到Azure是必需的。始终在该时区使用(并将使用)此数据库。

1
如何在SQL Azure上更改现有的主键?
我想修改SQL Azure表上的现有主键。 它当前有一个列,我想添加另一列。 现在,在SQL Server 2008上,这简直是小菜一碟,只是在SSMS里做了。做完了 如果我从SQL Server编写PK,这就是它的样子: ALTER TABLE [dbo].[Friend] ADD CONSTRAINT [PK_Friend] PRIMARY KEY CLUSTERED ( [UserId] ASC, [Id] ASC ) 但是,在SQL Azure上,当我尝试执行上述操作时,它当然会失败: Table 'Friend' already has a primary key defined on it. 很好,因此我尝试删除密钥: Tables without a clustered index are not supported in this version of SQL Server. …

1
普通的SELECT查询计划中的“恒定扫描”和“左外部联接”来自何处?
我有这张桌子: CREATE TABLE [dbo].[Accounts] ( [AccountId] UNIQUEIDENTIFIER UNIQUE NOT NULL DEFAULT NEWID(), -- WHATEVER other columns ); GO CREATE UNIQUE CLUSTERED INDEX [AccountsIndex] ON [dbo].[Accounts]([AccountId] ASC); GO 该查询: DECLARE @result UNIQUEIDENTIFIER SELECT @result = AccountId FROM Accounts WHERE AccountId='guid-here' 使用包含单个“索引搜索”的查询计划执行-符合预期: SELECT <---- Clustered Index Seek 该查询的作用相同: DECLARE @result UNIQUEIDENTIFIER SET …

1
与日期比较的子查询效果不佳
当使用子查询查找具有匹配字段的所有先前记录的总数时,在只有5万条记录的表上,性能会很糟糕。没有子查询,查询将在几毫秒内执行。使用子查询,执行时间超过一分钟。 对于此查询,结果必须: 仅包括给定日期范围内的那些记录。 包括所有先前记录的计数,不包括当前记录,无论日期范围如何。 基本表架构 Activity ====================== Id int Identifier Address varchar(25) ActionDate datetime2 Process varchar(50) -- 7 other columns 示例数据 Id Address ActionDate (Time part excluded for simplicity) =========================== 99 000 2017-05-30 98 111 2017-05-30 97 000 2017-05-29 96 000 2017-05-28 95 111 2017-05-19 94 222 2017-05-30 预期成绩 对于日期范围2017-05-29,以2017-05-30 …

2
为什么我的索引未在SELECT TOP中使用?
总结:我正在执行选择查询。WHEREand ORDER BY子句中的每一列都在单个非聚集索引中IX_MachineryId_DateRecorded,可以作为键的一部分,也可以作为INCLUDE列。我选择了所有列,因此将导致书签查找,但我只是在考虑TOP (1),因此可以肯定的是服务器可以告诉查找,最后只需要执行一次。 最重要的是,当我强制查询使用index时IX_MachineryId_DateRecorded,它在不到一秒钟的时间内运行。如果我让服务器决定使用哪个索引,它将选择IX_MachineryId,最多需要一分钟。这确实向我表明,我已正确编制了索引,而服务器只是在做出错误的决定。为什么? CREATE TABLE [dbo].[MachineryReading] ( [Id] INT IDENTITY (1, 1) NOT NULL, [Location] [sys].[geometry] NULL, [Latitude] FLOAT (53) NOT NULL, [Longitude] FLOAT (53) NOT NULL, [Altitude] FLOAT (53) NULL, [Odometer] INT NULL, [Speed] FLOAT (53) NULL, [BatteryLevel] INT NULL, [PinFlags] BIGINT NOT NULL, [DateRecorded] DATETIME NOT …

4
为什么TSQL为POWER(2.,64。)返回错误的值?
select POWER(2.,64.)返回18446744073709552000而不是18446744073709551616。似乎只有16位精度(四舍五入为17位)。 即使将精度明确化,select power(cast(2 as numeric(38,0)),cast(64 as numeric(38,0)))它仍然会返回四舍五入的结果。 这样看来,以任意精度将其任意掉落是一个非常基本的操作。它只能正确计算出的最高值POWER(2.,56.),失败了POWER(2.,57.)。这里发生了什么? 真正可怕的是select 2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.;实际上返回了正确的值。非常简洁。

1
我可以告诉何时和谁在Azure上将数据库从v11更新到v12吗?
今天早些时候,我注意到我所有的Azure SQL数据库服务器都从v11更新到了v12。我是公司中唯一应触摸这些拨盘的人,但不是公司中唯一具有访问权限的人。由于我没有启动此升级,因此我想找出是谁进行的以及何时进行此计划外的更新。 我知道我可以给公司的每个人写一封电子邮件,并且可以礼貌地向WTF询问信息,但是我宁愿以尽可能多的事实开始对话。另外,我倾向于认为这是Microsoft / Azure SNAFU,因为升级所有服务器都太刻意了。

4
应用程序中的Azure SQL数据库“用户登录失败”,但在SSMS中工作正常
我想尝试Azure SQL Database V12上包含的数据库用户功能,但是在进行身份验证时遇到问题,这对我来说似乎很奇怪。 我创建了一个名为的数据库Classifier。我将IP添加到了防火墙规则中,以便可以从工作站上的SSMS连接到Azure db服务器。一旦能够通过SSMS进行管理连接,我就尝试将具有密码的用户添加到数据库中,如下所示: CREATE USER classifier WITH PASSWORD='thepassword' 我还将此用户添加到数据编写者和读取者角色: exec sp_addrolemember 'db_datawriter', 'classifier' exec sp_addrolemember 'db_datareader', 'classifier' 之后,我可以使用来自SSMS的这些凭据连接到数据库: 但这就是问题的所在:我尝试了几种不同的连接字符串,但似乎无法在我正在开发的Web应用程序中建立连接。它在Azure环境中不起作用,因此我正在localhost上运行,并具有到Azure数据库的连接字符串,并且它将无法连接。这是我目前正在使用的连接字符串: <add name="Classifier" connectionString="Data Source=xxxxxxx.database.secure.windows.net;Initial Catalog=Classifier;User ID=classifier;Password=xxxxxxxxxxxxx;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" providerName="System.Data.SqlClient"/> 我尝试过为用户重置密码(通过SSMS),然后更新连接字符串。我还通过将密码直接从此连接字符串中复制并复制到SSMS的“连接”对话框中来仔细检查了密码,以确保那里没有错字。 我在Azure数据库服务器中启用了审核,希望获得有关失败原因的详细信息,但我得到的只是以下内容: 这就是我遇到的问题。通过文档或博客可以找到的大多数内容都表明,要做的事情是查看SQL Server日志,以查看真正的错误状态,这将更狭窄地指示失败的性质,但是由于我就Azure而言,没有办法做到这一点(据我所知)。 是什么会导致应用程序在SSMS(以及附带的LinqPad和Visual Studio Server Explorer)成功的地方失败?

2
如何使Brent Ozar的sp_BlitzIndex在Azure上运行?
我从Brent Ozar的网站下载了SQL Server急救包。当我尝试通过Microsoft Sql Server Management Studio对我的主数据库运行sp_BlitzIndex脚本时,以Azure数据库服务器级管理员身份登录时,出现以下错误: 消息262,级别14,状态18,过程sp_BlitzIndex,第18行在数据库'master'中拒绝了CREATE PROCEDURE权限。 我在要测试的数据库实例上成功创建了该过程。当我执行该过程时,出现错误提示: 消息50000,级别16,状态1,行1265无效的对象名称“ mydatabase.sys.partitions”。 接下来,我尝试变得聪明,直接对master数据库运行存储过程代码,而不创建存储过程,并收到以下错误: 消息50000,级别15,状态1,行1267在此版本的SQL Server中,不支持在“ mydatabase.sys.indexes”中引用数据库和/或服务器名称。 我没有足够的信心开始玩弄大约2700行索引启发式逻辑的内部工作。是否有一种快速简便的方法来使该存储过程在Azure SQL数据库上正常工作,还是应该在其他地方寻找索引分析工具/存储过程?

6
重建非常大的主键索引
我有一个托管在Azure上的SQL数据库。问题在于大小已失控,我可以在主键聚集索引中看到多达99%的碎片。 我能够使用online=onoption 重建所有其他索引,并且不会影响性能。PK聚簇索引之一的大小大于200GB,并且为此REBUILD...WITH (ONLINE=ON)导致锁定。 实际上,确实有来自所有时区的用户都在访问该网站,因此,我找不到可以离线重建索引的时间。 在不造成站点停机的情况下重建大型索引的最佳策略是什么? 我相信重组将无济于事,因为碎片化率为99%。问题在于该表即使在线也被锁定。主要问题是索引大于200GB。主键是一个整数。

1
SQL Server的顺序慢
在我的应用程序中,我有一个查询,该查询在“文件”表中执行搜索。 表“ files”按“ f”。“ created”分区(请参阅表定义),客户端19有约2600万行(“ f”。” cid = 19)。 关键是,如果我执行以下查询: SELECT "f"."id" AS "FileId" , "f"."name" AS "FileName" , "f"."year" AS "Fileyear" , "f"."cid" AS "clientId" , "f"."created" AS "FileDate" , CASE WHEN ("vnVE0"."value" is not null AND "vnVE0"."value" != '') THEN CAST("vnVE0"."value" AS decimal(28,2)) ELSE 0 END AS "keywordValueCol0_numeric" …

2
为什么我的WHERE子句从“包含”列中受益?
根据此答案,除非在用于限制的列上建立索引,否则查询将不会从索引中受益。 我有这个定义: CREATE TABLE [dbo].[JobItems] ( [ItemId] UNIQUEIDENTIFIER NOT NULL, [ItemState] INT NOT NULL, [ItemPriority] INT NOT NULL, [CreationTime] DATETIME NULL DEFAULT GETUTCDATE(), [LastAccessTime] DATETIME NULL DEFAULT GETUTCDATE(), -- other columns ); CREATE UNIQUE CLUSTERED INDEX [JobItemsIndex] ON [dbo].[JobItems]([ItemId] ASC); GO CREATE INDEX [GetItemToProcessIndex] ON [dbo].[JobItems]([ItemState], [ItemPriority], [CreationTime]) INCLUDE (LastAccessTime); …

5
如何从Azure SQL数据库中删除错误的执行计划?
DBCC FREEPROCCACHE在Azure SQL DB中不起作用。我还能如何强制计划以一种不会损害生产系统的方式将自己从缓存中踢出(即,我不能只是随意改变表)?这是专门针对由Entity Framework创建的SQL,因此它们不是自我管理的存储过程-它实际上是动态SQL。 (来源是错误的索引->错误的统计信息,等等。这些都是固定的,但是错误的计划不会消失。) 更新: 我选择了@mrdenny的解决方案,因为他先到达了那里。但是,我已经成功使用@Aaron Bertrand的脚本执行了工作。感谢大家的帮助!

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.