标签: azure-sql-database

聚集索引现在是必须的——为什么?

早些时候,对我来说,关于是否(总是)使用/避免聚集索引的辩论/讨论没有定论。

好吧,我知道它们有时会在适当的+特定目的和上下文中使用。

SQL Azure 数据库聚集索引要求

“SQL Azure 不支持没有聚簇索引的表。一个表必须有一个聚簇索引。如果一个表是在没有聚簇约束的情况下创建的,那么在允许对该表进行插入操作之前必须先创建一个聚簇索引”

不符合先前的结论、理由和解释。

我在前面的解释中遗漏了严格要求无任何例外地普遍存在的聚集索引的基本原理是什么?

index database-design sql-server azure-sql-database

9
推荐指数
2
解决办法
1251
查看次数

在同一个事务中执行读取和写入

我正在尝试在我的应用程序中实现事务。我只是想像 BeginTransaction() 文档中显示的示例一样实现它。

Public Shared Sub Process(wwid As String, trade_id As Integer, disposition As Boolean)

    Dim q As String
    Dim cmd, cmd_select As SqlCommand
    Dim reader As SqlDataReader
    Dim trans As SqlTransaction

    Dim user_id As Integer = User.CheckAuthentication(wwid)
    If user_id > 0 Then
        Using conn As New SqlConnection(CNGDB)
            conn.Open()
            '1. ReadUncommitted
            '2. ReadCommitted
            '3. RepeatableRead
            '4. Serializable
            '5. Snapshot
            trans = conn.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted)
            Try
                q = "UPDATE Trades SET Disposition = @disposition, FinalizedAt = @finalized_at" & _
                    " WHERE …
Run Code Online (Sandbox Code Playgroud)

sql-server ado.net transaction azure-sql-database

8
推荐指数
1
解决办法
4893
查看次数

来自 Azure 托管 Web 应用程序的 SQL Azure 上的“用户登录失败”

我有一个使用 SQL Azure db 的 Azure ASP.net MVC Web 应用程序。它工作了几个月(某天由于某种原因 Azure 更改了服务器的名称,我不得不再次设置,但一切正常),但现在它不起作用。

首先我想,他们可能再次更改了服务器名称,但我打开了我的 SSMS 并在重置密码后再次连接。所以我在我的应用程序连接字符串中更改了密码并测试一切正常,是的,调试和测试工作正常。所以我发布了,但是一旦发布应用程序就会抛出错误

Login failed for user 'my_username'
Run Code Online (Sandbox Code Playgroud)

在应用程序中查看了这篇Azure SQL 数据库“用户登录失败”的帖子,但在 SSMS工作正常,这看起来很相似,但我无法在不出错的情况下做到这一点。

我从此更改了连接字符串

Server=tcp:SERVER_NAME.database.windows.net,1433;Database=my_db;User ID=my_username@qtdhcrrxmi;Password={my_password}; Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;
Run Code Online (Sandbox Code Playgroud)

对此

Server=tcp:SERVER_NAME.database.windows.net,1433;Initial Catalog=my_db;Persist Security Info=False;User ID={my_username};Password={my_password};Pooling=False;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;
Run Code Online (Sandbox Code Playgroud)

正如 Azure 门户中显示的那样,在数据库连接字符串中。我只删除了属性

 Data Source=SERVER_NAME.database.windows.net;
Run Code Online (Sandbox Code Playgroud)

我还检查了发布过程不会更改连接字符串。

但它仍然适用于调试和 SSMS,但不适用于生产。

azure-sql-database connectivity

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

在具有数百万行的表上进行慢速 JOIN

在我的应用程序中,我必须连接数百万行的表。我有一个这样的查询:

SELECT DISTINCT "f"."id" AS "FileId"  
, "f"."name" AS "FileName"  
, "f"."year" AS "FileYear"  
, "vt"."value" AS "value"  
FROM files "f"  
JOIN "clients" "cl" ON("f"."cid" = "cl"."id" AND "cl"."id" = 10)  
LEFT JOIN "value_text" "vt" ON ("f"."id" = "vt"."id_file" AND "vt"."id_field" = 65739)  
GROUP BY "f"."id", "f"."name", "f"."year", "vt"."value"  
Run Code Online (Sandbox Code Playgroud)

表“files”有1000万行,表“value_text”有4000万行。

这个查询太慢了,执行需要 40 秒(15000 个结果) - 3 分钟(65000 个结果)。

我曾想过将两个查询分开,但我不能,因为有时我需要按连接的列(值)排序...

我能做什么?我将 SQL Server 与 Azure 结合使用。具体而言,具有定价/模型层“PRS1 PremiumRS (125 DTU)”的 Azure SQL 数据库

我收到了大量数据,但我认为互联网连接不是瓶颈,因为在其他查询中,我也收到了大量数据,而且速度更快。

我尝试使用客户端表作为子查询并DISTINCT使用相同的结果进行删除。

我在客户端表中有 1428 行。 …

performance azure-sql-database query-performance

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

TOP(1) BY GROUP 非常大的 (100,000,000+) 表

设置

我有一个大约 115,382,254 行的大表。该表相对简单,记录了应用程序进程操作。

CREATE TABLE [data].[OperationData](
    [SourceDeciveID] [bigint] NOT NULL,
    [FileSource] [nvarchar](256) NOT NULL,
    [Size] [bigint] NULL,
    [Begin] [datetime2](7) NULL,
    [End] [datetime2](7) NOT NULL,
    [Date]  AS (isnull(CONVERT([date],[End]),CONVERT([date],'19000101',(112)))) PERSISTED NOT NULL,
    [DataSetCount] [bigint] NULL,
    [Result] [int] NULL,
    [Error] [nvarchar](max) NULL,
    [Status] [int] NULL,
 CONSTRAINT [PK_OperationData] PRIMARY KEY CLUSTERED 
(
    [SourceDeviceID] ASC,
    [FileSource] ASC,
    [End] ASC
))

CREATE TABLE [model].[SourceDevice](
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL,
 CONSTRAINT [PK_DataLogger] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
))

ALTER TABLE [data].[OperationData]  WITH …
Run Code Online (Sandbox Code Playgroud)

index sql-server partitioning azure-sql-database

8
推荐指数
1
解决办法
1628
查看次数

为什么聚集索引搜索会返回比基础表中的行数更高的“实际行数”?

我正在解决与 SQL Server(技术上是 Azure SQL 数据库)相关的问题,偶尔会选择错误的执行计划,大概是由于统计数据不准确。sp_updatestats每次都修复它,直到几个小时或几天后,一个糟糕的计划再次被缓存。

看着“糟糕”的计划,我注意到一些让我感到奇怪的事情:在当前大约有 170 万行的表上有一个聚集索引查找。此操作的“估计行数”约为 1200,这绝对符合我在这种情况下对该操作所期望的平均行数,但“实际行数”超过 6000 万!沿着这个叶节点的粗线,在所有 6000 万个节点上执行各种下游操作,例如连接和排序,导致过慢、溢出到 tempdb 和其他坏处。

我一定误解了聚集索引查找实际上是做什么的,因为我认为它不可能“输出”比基础表中更多的行。什么可能导致这种情况?更好的是,有关如何修复它的任何指示?

[包含诸如“sp_updatestats每次修复它但无法弄清楚如何永久修复它?阅读这篇文章”之类的奖励积分。这是我们最近在几个不同方面的普遍问题。]

sql-server optimization execution-plan azure-sql-database

8
推荐指数
1
解决办法
1317
查看次数

在 SSDT 项目中存储 CREATE EXTERNAL DATA SOURCE 而不暴露 DATABASE SCOPED CREDENTIAL 或 MASTER KEY 秘密;

我有一个部署到 Azure SQL DB 的 SSDT 项目。最近我添加了一个外部表。这需要一个外部数据源,如下所示:

CREATE EXTERNAL DATA SOURCE [data_warehouse]
    WITH (
    TYPE = RDBMS,
    LOCATION = N'mydb.database.windows.net',
    DATABASE_NAME = N'MainDW',
    CREDENTIAL = [dw_reader]
    );
Run Code Online (Sandbox Code Playgroud)

当我将它导入到我的 .sqlproj 中时,它抱怨凭证不存在,然后当我添加它时它抱怨主密钥不存在。问题是我不想将这些秘密存储在 SSDT 项目中。如何在 Azure Decops 中存储可以从 Azure Keyvault 或其他存储机密的方法中覆盖和检索的虚拟项或默认值?

azure-sql-database ssdt

8
推荐指数
1
解决办法
927
查看次数

为什么 OPTION RECOMPILE 会导致谓词下推?

我有一个 SQL 查询,它是由一堆嵌套的视图和表值函数组成的,深度至少为 4 层(我没有时间或耐心去完成这一切,它有数百行代码在每个级别)。

我一直试图理解为什么当我使用选项(重新编译)运行基本查询时它运行得非常快,但是当我在没有这个选项的情况下运行它时,它运行得非常慢。

我已确保在发生这种情况之前清除计划缓存,即使在生成新计划时,它也不是最佳的,但是,选项(重新编译)速度很快。

我检查了这两个计划,并注意到对于带有选项(重新编译)的计划,传递的参数。

SELECT [p].[Activity]
    ,[p].[ActivityType]
    ,[p].[Company]
    ,[p].[Flags]
    ,[p].[Id]
    ,[p].[Name]
    ,[p].[Priority]
    ,[p].[Filters]
    ,[p].[Priority]
    ,[p].[Classification]
    ,[p].[Number]
    ,[p].[TaskFilter]
    ,[p].[TaskType]
    ,[p].[User]
FROM (
    SELECT *
    FROM [ActivProdStatuses]('ProdJobTask', 0)
    ) AS [p]
WHERE (
        (   ([p].[User] = 'some_value') AND (([p].[Flags] & 8) = 0) ) 
           AND ([p].[Activity] = 'unique_value') 
        )
    AND  
      (CASE 
        WHEN ([p].[Flags] & 4) <> 0
         THEN CAST(1 AS BIT)
         ELSE CAST(0 AS BIT)
       END = 1 )
ORDER BY [p].[Priority]
OPTION (RECOMPILE)
Run Code Online (Sandbox Code Playgroud)

在没有 OPTION …

sql-server execution-plan azure-sql-database recompile query-performance

8
推荐指数
1
解决办法
1456
查看次数

当我有索引时为什么要进行排序?

Azure SQL 数据库。

我有一个表,我需要从中获取Col1Col2基于 的第一行和最新行CreateDate

CREATE TABLE dbo.table1 (
    Id            INT    IDENTITY(1,1) PRIMARY KEY ,
    Col1        VARCHAR(255) COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL ,
    Col2        VARCHAR(255) COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL ,
    CreateDate    DATETIME NOT NULL
) ;
Run Code Online (Sandbox Code Playgroud)

我有一个像这样的索引:

CREATE INDEX IX__table1_ASC
ON dbo.table1 (Col1, Col2, CreateDate );
Run Code Online (Sandbox Code Playgroud)

我获取第一行的查询是(计划在这里):

--Get the first row
SELECT    TOP (1) WITH TIES
        *
FROM    table1
ORDER BY ROW_NUMBER()
        OVER (PARTITION BY Col1, Col2
              ORDER BY CreateDate );
Run Code Online (Sandbox Code Playgroud)

索引扫描使用我创建的索引 ( …

sql-server optimization execution-plan azure-sql-database query-performance

8
推荐指数
1
解决办法
2110
查看次数

在 SQL Azure DB 上遇到 CLR 错误

我们突然开始看到这个错误,而且在调用我们的弹性池中的数据库或任何其他数据库时,它似乎经常发生。DTU 没有被最大化,资源 dmvs 看起来也不错。

无法使用 HRESULT 0x80131022 进入公共语言运行时 (CLR)。这可能是由于低资源条件。(D b)

这是我从系统资源调控器池中得到的

Resource Pool Name           cache_memory (MB)   used_memory (MB)
internal                     104.773437          1577.125000
default                      37.609375           38.796875
SloSecSharedPool             2.914062            8.156250
InMemBackupRestorePool       26.210937           101.437500
InMemDmvCollectorPool        186.195312          203.406250
InMemMetricsDownloaderPool   2.234375            2.250000
InMemDTAPool                 0.000000            0.000000
SloHkPool                    0.000000            0.031250
InMemQueryStorePool          22.453125           35.304687
InMemWIAutoTuningPool        3.312500            4.062500
InMemXdbLoginPool            3.976562            6.250000
PVSCleanerPool               0.000000            0.000000
InMemTdeScanPool             0.000000            0.000000
SloSharedPool1               1108.890625         1234.312500
Run Code Online (Sandbox Code Playgroud)

从 sys.dm_os_performance_counters 这是过去 3 小时的样子。

cpu%    data_io%   log_write%   memory_usage%   max_worker%   sessions%
22.37   73.51      16.54        41.56           5.50          0.43
Run Code Online (Sandbox Code Playgroud)

这似乎不是 SQL Azure …

sql-server azure-sql-database sql-clr

7
推荐指数
1
解决办法
1227
查看次数