AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-76501

Skary's questions

Martin Hope
Skary
Asked: 2023-09-20 17:33:39 +0800 CST

如何让远程SQL Server拉取本地SQL Server数据

  • 5

在我的场景中,我有一个 SQL Server Express 作为我的数据源。它定期生成一批数据,这些数据应上传到中央存储库(云中的 SQL Server SE)。数据源知道中央存储库,但中央存储库不知道任何可能的数据源(可能会随着时间的推移而改变)。我不知道 SQL Server Express 是否支持日志传送,也不熟悉这项技术,无论如何,我会指出,出于其他原因,它不是一个可行的解决方案。

我目前的解决方案是在需要时从数据源通过链接服务器(指向云端SQL Server SE)上传所有数据。毫无疑问,这是可行的,但监视中央 SQL Server SE(在云中)时,我看到大量请求。在我看来,阅读文档认为推送数据效率低下,并且会一次推送一行(这解释了我遇到的性能不佳以及中央 SQL Server SE 上的请求量)。

我想知道是否有一种方法可以远程执行由远程 SQL Server 触发的中央 SQL Server 拉取操作。这样我就可以利用这样一个事实:提取数据应该比推送数据更高效,并绕过中央 SQL Server 不知道哪个数据源将在何时联系它的问题。

sql-server
  • 2 个回答
  • 50 Views
Martin Hope
Skary
Asked: 2023-09-18 21:58:33 +0800 CST

SQL Server 查询的性能调整,使用 LEFT OUTER JOIN 与 INNER JOIN

  • 5

在我的场景中,我需要优化一个存储过程,我用它从交换数据库将数据导入数据库。我真的很困惑,因为 INNER JOIN 的解决方案低于 LEFT OUTER JOIN 解决方案,基本上看来我检查“关系”存在的方式导致了巨大的减速。

更清楚地说,我有一个带有几个表格的 Final_DB,一个用于文章 (tbl_ana_Articles),一个用于文章属性,又名特征 (tbl_ana_Characteristics),以及几个其他表。在另一个 Exchange_DB 中,我获取文章和属性/特征之间的关系(它用于定期更新 Final_DB 中的关系)。

由交换数据库提供的具有关系的表需要先取消透视,然后才能有用(当我得到它时,它不是交叉联接表,在取消透视后它变成交叉联接)。

所以基本上我以这种方式编写查询:

WITH ExchangeArticleCode_CharacteristicCode AS (
  SELECT [ACODAR], SUBSTRING([TNCAR],5,2) AS [TNCAR] , [TVALOR]
  FROM [EXCHANGE_DB].[dbo].[ANART00F]
  UNPIVOT
  (
   [TVALOR]
   FOR [TNCAR] in ([ACAR01], ACAR02, ACAR03, ACAR04 , ACAR05 , ACAR06 , ACAR07 , ACAR08 , ACAR09 , ACAR10 , ACAR11 , ACAR12 , ACAR13 , ACAR14 , ACAR15 , ACAR16 , ACAR17 , ACAR18 , ACAR19 , ACAR20)
  ) AS [UNPIVOT]
  WHERE [TVALOR] IS NOT NULL AND [TVALOR] != ''
)

SELECT Characteristic.[ID]        AS [ID_CHARACTERISTIC]
       ,Article.[ID]               AS [ID_ARTICLE]
       ,Characteristic.[ID_FILTER] AS [ID_FILTER]
FROM ExchangeArticleCode_CharacteristicCode
LEFT OUTER JOIN [dbo].[tbl_ana_Articles] AS Article 
 ON (ExchangeArticleCode_CharacteristicCode.ACODAR collate Latin1_General_CI_AS) = Article.CODE
LEFT OUTER JOIN [dbo].[tbl_ana_Characteristics] AS Characteristic 
 ON (ExchangeArticleCode_CharacteristicCode.TNCAR collate Latin1_General_CI_AS) + '_' + (ExchangeArticleCode_CharacteristicCode.TVALOR collate Latin1_General_CI_AS) = Characteristic.ID_ERP
WHERE Characteristic.[IS_ACTIVE] = 1 

这个解决方案的速度令人惊讶,但有问题,有时交换数据库中有垃圾,因此左连接无法匹配代码,并且在结果表中我得到一些 NULL。如果我尝试防止 NULL,将 LEFT OUTER JOIN 替换为 INNER JOIN 或在 where 条件中添加检查(IS NOT NULL),则查询执行起来会变得非常缓慢且繁重。我不清楚为什么以及如何避免这种情况。

这里是快速查询的执行计划: https://www.brentozar.com/pastetheplan/ ?id=ryMBHCryp

这里是慢查询的执行计划: https://www.brentozar.com/pastetheplan/ ?id=SywALRS16

公平地说,在我看来,慢速查询有一个昂贵的嵌套循环,但是为什么 INNER JOIN 在这样的嵌套循环中进行转换?

sql-server
  • 2 个回答
  • 45 Views
Martin Hope
Skary
Asked: 2023-07-31 23:24:41 +0800 CST

调整 SQL Server 2019 以接收许多小型查询

  • 5

我正在运行 IIS 10 的 Windows Server 2019(带 SSD 驱动器)上使用 SQL Server SE 2019。在 IIS 10 之上运行 ASP.Net 应用程序,必须按原样考虑(我无法修改它) 。

最近发现 ASP.Net 应用程序可能变得有点过于啰嗦,并开始批量进行许多数据库查询(很少突发 20-30 个查询/秒)。在重负载下这可能会成为一个问题,所以我想提高系统性能。SQL Server 的安装没有任何特定配置(安装向导的默认配置)。

我想知道是否有一些已知的配置可以调整(SQL Server/IIS),它可以优化以 20-30 个查询/秒的批量发送许多小而快速的查询(每个查询大约 5 毫秒)的场景。这样我就可以改善 ASP.Net 应用程序负载较重的情况,并开始向数据库发送大量快速查询

sql-server-2019
  • 1 个回答
  • 38 Views
Martin Hope
Skary
Asked: 2023-07-07 18:55:01 +0800 CST

SQL Server 2019 SE 采用内存中 OLTP 表的注意事项

  • 5

我有一个 SQL Server 数据库,它几乎是一个只读数据库(写入过程将在预定时间发生,通常每天两次)。我最近发现了内存表(我是一名开发人员,而不是 DBA 专家),想知道将数据库移至“内存”版本是否是一个好主意;此配置的一般问题是什么?

内存表对我来说是一个新主题,我很困惑这些表是否只适合加速 IO 操作,或者也适合简单查询(特别是已经离散的查询)。我也很想知道当 SQL Server 可以使用离散快速 SSD 时,这项技术是否也是一个好的选择。我不想问得太宽泛,但我也对迁移到这项技术期间可能发生的已知问题感到好奇。

PS:为了给你一些背景知识,我想到了这个想法,因为我面临着一些性能问题。查询已经相当高效,但我的查询很少(已经尽可能优化),大约需要 0.2-0.3 秒,对于我的需要来说太多了。出于好奇,我要补充一点,这种计时需求是由于这些“慢速”查询绑定到 Web 请求,应该在不到一秒的时间内完成。

sql-server
  • 1 个回答
  • 34 Views
Martin Hope
Skary
Asked: 2023-02-10 06:53:32 +0800 CST

SQL Server 过程,用于查找和替换大表中的数据

  • 6

我需要编写一个存储过程来更新我的数据库中的链接引用。链接可以包含在几个包含 JSON(可能包含一些 url)的 nvarchar 字段中。

为此,我每次迭代分批更新 8129 个项目的表,这样机器就不会挂起(理论上)。

但是现在代码似乎无论如何都挂了,它不会打印任何消息并且程序继续运行(不影响任何数据)很多分钟,直到我不得不终止程序(同时似乎没有影响任何数据) .

如果我尝试在玩具示例上使用相同的逻辑,我没有遇到任何问题,所以我认为我的问题是由于表很大(几十万行)。

这里是最小的例子,更大的表上完全相同的代码显然什么也没做(用 SQL Server 2019 测试)。

程序代码:

ALTER PROCEDURE [dbo].[SiteUrlChangeURL]
    @FullOldUrl nvarchar(500),
    @FullNewUrl nvarchar(500)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    SET @FullOldUrl = ISNULL(@FullOldUrl,'');
    SET @FullNewUrl = ISNULL(@FullNewUrl,'');

    IF ( LEN(@FullOldUrl) <= 0 OR LEN(@FullNewUrl) <= 0 )
    BEGIN 
        PRINT('Invalid parameters');
        RETURN 1;
    END

    --ARTICLE
    RAISERROR ('updating articles',0,1) WITH NOWAIT;
    WHILE 1=1
    BEGIN
        UPDATE TOP (8196) [dbo].[tbl_ana_Articles]
           SET [_ATTRIBUTES]    = REPLACE([_ATTRIBUTES]   , @FullOldUrl, @FullNewUrl)
              ,[_DOCUMENTS]     = REPLACE([_DOCUMENTS]    , @FullOldUrl, @FullNewUrl)
              ,[_SEO]           = REPLACE([_SEO]          , @FullOldUrl, @FullNewUrl)
              ,[_TRANSLATIONS]  = REPLACE([_TRANSLATIONS] , @FullOldUrl, @FullNewUrl)
              ,[_TAGS]          = REPLACE([_TAGS]         , @FullOldUrl, @FullNewUrl)
              ,[_NOTES]         = REPLACE([_NOTES]        , @FullOldUrl, @FullNewUrl)
        WHERE 
            [_ATTRIBUTES]   like '%' + @FullOldUrl + '%' OR
            [_DOCUMENTS]    like '%' + @FullOldUrl + '%' OR
            [_SEO]          like '%' + @FullOldUrl + '%' OR
            [_TRANSLATIONS] like '%' + @FullOldUrl + '%' OR
            [_TAGS]         like '%' + @FullOldUrl + '%' OR
            [_NOTES]        like '%' + @FullOldUrl + '%'

        IF (@@ROWCOUNT <= 0)
        BEGIN
            BREAK;
        END
    END

 RETURN 0;

例子 :

CREATE TABLE [dbo].[tbl_ana_Articles](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [ID_BRAND] [int] NOT NULL,
    [CODE] [nvarchar](40) NOT NULL,
    [CODFOR] [nvarchar](40) NOT NULL,
    [COD_ALT01] [nvarchar](50) NOT NULL,
    [COD_ALT02] [nvarchar](50) NOT NULL,
    [COD_ALT03] [nvarchar](50) NOT NULL,
    [ID_UOM] [int] NOT NULL,
    [IS_ACTIVE] [bit] NOT NULL,
    [_ATTRIBUTES] [nvarchar](max) NOT NULL,
    [_DOCUMENTS] [nvarchar](max) NOT NULL,
    [_SEO] [nvarchar](max) NOT NULL,
    [_TRANSLATIONS] [nvarchar](max) NOT NULL,
    [_TAGS] [nvarchar](max) NOT NULL,
    [_NOTES] [nvarchar](max) NOT NULL,
    [_METADATA] [nvarchar](max) NOT NULL,
    [IS_B2B] [bit] NOT NULL,
    [IS_B2C] [bit] NOT NULL,
    [IS_PROMO] [bit] NOT NULL,
    [IS_NEWS] [bit] NOT NULL,
    [CAN_BE_RETURNED] [bit] NOT NULL,
    [IS_SHIPPABLE] [bit] NOT NULL,
    [HAS_SHIPPING_COSTS] [bit] NOT NULL,
    [IS_PURCHEASABLE] [bit] NOT NULL,
 CONSTRAINT [PK_tbl_ana_articles] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO



INSERT INTO [dbo].[tbl_ana_Articles]
           ([ID_BRAND]
           ,[CODE]
           ,[CODFOR]
           ,[COD_ALT01]
           ,[COD_ALT02]
           ,[COD_ALT03]
           ,[ID_UOM]
           ,[IS_ACTIVE]
           ,[_ATTRIBUTES]
           ,[_DOCUMENTS]
           ,[_SEO]
           ,[_TRANSLATIONS]
           ,[_TAGS]
           ,[_NOTES]
           ,[_METADATA]
           ,[IS_B2B]
           ,[IS_B2C]
           ,[IS_PROMO]
           ,[IS_NEWS]
           ,[CAN_BE_RETURNED]
           ,[IS_SHIPPABLE]
           ,[HAS_SHIPPING_COSTS]
           ,[IS_PURCHEASABLE])
     VALUES
           (1
           ,'COD1'
           ,'SUPPLIER1'
           ,'CATEGORY1'
           ,'CATEGORY1-BIS'
           ,'CATEGORY2'
           ,1
           ,1
           ,'{ "url" : "https://old.com" }'
           ,''
           ,''
           ,''
           ,''
           ,''
           ,''
           ,1
           ,0
           ,0
           ,0
           ,1
           ,1
           ,0
           ,1);
           
    DECLARE @FullOldUrl AS NVARCHAR(50) = 'https://old.com';
    DECLARE @FullNewUrl AS NVARCHAR(50) = 'https://new.com';

    --ARTICLE
    PRINT('updating articles');
    WHILE 1=1
    BEGIN
        UPDATE TOP (8196) [dbo].[tbl_ana_Articles]
           SET [_ATTRIBUTES]    = REPLACE([_ATTRIBUTES]   , @FullOldUrl, @FullNewUrl)
              ,[_DOCUMENTS]     = REPLACE([_DOCUMENTS]    , @FullOldUrl, @FullNewUrl)
              ,[_SEO]           = REPLACE([_SEO]          , @FullOldUrl, @FullNewUrl)
              ,[_TRANSLATIONS]  = REPLACE([_TRANSLATIONS] , @FullOldUrl, @FullNewUrl)
              ,[_TAGS]          = REPLACE([_TAGS]         , @FullOldUrl, @FullNewUrl)
              ,[_NOTES]         = REPLACE([_NOTES]        , @FullOldUrl, @FullNewUrl)
        WHERE 
            [_ATTRIBUTES]   like '%' + @FullOldUrl + '%' OR
            [_DOCUMENTS]    like '%' + @FullOldUrl + '%' OR
            [_SEO]          like '%' + @FullOldUrl + '%' OR
            [_TRANSLATIONS] like '%' + @FullOldUrl + '%' OR
            [_TAGS]         like '%' + @FullOldUrl + '%' OR
            [_NOTES]        like '%' + @FullOldUrl + '%'

        IF (@@ROWCOUNT <= 0)
        BEGIN
            BREAK;
        END
    END
    
    SELECT * FROM [dbo].[tbl_ana_Articles]
    PRINT('Finished');

这是玩具示例生成的执行计划(我无法获得真实场景的执行计划)。

https://www.brentozar.com/pastetheplan/?id=SJhVTcMTo

我真的很困惑是什么导致了这个问题

- 编辑 :

我再次运行该程序,发现如果我运行足够长的时间(~30 分钟),我就会得到正确的行为。所以显然我在这里遇到了性能问题。我对这里的性能并不感兴趣,因为在维护期间(仅当站点更改域时)很少(手动)使用该过程。

但我很好奇我是否在这里犯了一些错误,以获得如此低的性能

sql-server
  • 1 个回答
  • 127 Views
Martin Hope
Skary
Asked: 2023-01-06 06:15:20 +0800 CST

机器主机入侵时SQL Server数据保密

  • 8

我必须承认我是一名程序员,即使我没有相同的背景,我也在努力学习一些关于 DBA 的知识。我试图了解在 SQL Server 上提供什么安全性以及如何使用静态数据加密。

我的问题是,在未经授权访问托管 SQL Server 实例的计算机的情况下,加密将如何保护数据?我的猜测根本不是。

我的意思是,假设 SQL Server 在放置在数据中心的虚拟机上运行,​​并“连接”到互联网。如果攻击者将获得对虚拟机的控制权,那么我认为静态数据保护的作用将非常有限。

事实上,攻击者可以获得管理员权限(作为 OS 用户),重置 SQL Server 凭据并以“sa”身份登录,然后即使 SQL Servr 文件通常是加密的,他也可以以纯文本形式导出它们。

在这种情况下,有什么方法可以保护 SQL Server 的安全,或者在操作系统级别发生破坏的情况下,SQL Server 是否被视为“丢失”?

sql-server
  • 1 个回答
  • 108 Views
Martin Hope
Skary
Asked: 2022-05-11 00:18:54 +0800 CST

数据库和连接字符串上的 SQL Server 超时

  • 2

最近我发现(我必须假设我不是 DBA)可以在 SQL Serve 属性中配置超时(适用于 SQL Server 实例中的所有 DB):

在此处输入图像描述

忽略图片显示超时0的事实(我正在试验,不会是最终配置);我很困惑,因为我知道应该将超时配置到连接到 SQL Server 实例的客户端中(连接和命令超时)。

现在我想知道如果 SQL Sever 配置说超时为 10 分钟并且客户端使用 20 分钟的连接字符串(命令和连接)连接会发生什么。应用了哪个超时?

sql-server configuration
  • 1 个回答
  • 1393 Views
Martin Hope
Skary
Asked: 2022-03-02 03:57:20 +0800 CST

SQL Server 允许存储过程链接

  • 5

我必须假设我不是 DBA,但我需要维护一个 SQL Server 实例,并且存储过程权限链接几乎没有问题(希望条款是正确的)。

为了简要解释我的需求,我有一个用户应该只在一个应该运行包含对外部数据库的引用的存储过程(在那个“授予”数据库上)的数据库上授予权限(我应该继承一些授权)

详细地说,我的情况是我有三个数据库

  1. 配置数据库(每个人都应该阅读,但除了配置用户之外,任何人都不能写)
  2. 暂存数据库(应由暂存过程读取/写入)
  3. 最终数据库(应由应用程序读取/写入)

所以我有三个用户

  1. 配置用户:用于维护配置数据库中的数据
  2. Staging User :由许多将数据放入 Staging DB 的 staging 过程(非常长的过程,可能需要数小时)使用
  3. 最终用户:由在登台过程完成时读取数据的应用程序用于在登台数据库中部署数据并将其放回最终数据库。最终用户可以访问每个数据库(至少用于阅读)

到目前为止一切顺利,登台程序完成他们的工作,并在完成时编写一个信号量(通知数据准备好)。有时应用程序(使用最终用户)检查信号量并将所有数据摄取到最终数据库中。

现在我必须支持一个快速、按需的暂存过程(由于其他原因,我仍然需要从暂存数据库执行),完成后,应该直接将数据更新到最终数据库。

我已经编写了这样的程序并且一切都按预期工作,但是我必须将 FinalDB 上的读/写操作授予临时用户,我不喜欢它。有许多使用 Staging User 的应用程序,其中一些不是“在我的控制之下”,所以我不认为应该将数据写入 Staging DB 的错误应用程序最终会弄乱 Final DB。我可以接受我的新的按需登台过程可能很关键(最终会弄乱最终数据库)。

所以问题是,Staging User 已经被授予执行存储过程(例如:OnDemandUpdate),因为它是 Staging DB 的一部分,但包含对外部表(来自 Final DB)的插入/更新,我希望授予可以是链式的。我怎样才能做到这一点?

sql-server stored-procedures
  • 1 个回答
  • 281 Views
Martin Hope
Skary
Asked: 2022-01-11 05:40:11 +0800 CST

SQL Server 表查询带分页性能调优,了解当前解决方案

  • 6

如标题中所述,我开始使用由使用 Linq To SQL 作为 ORM 的遗留程序生成的分页对表查询进行性能调整。

我发现强烈建议在分页前对表格进行排序的资源: https ://rimdev.io/optimizing-linq-sql-skip-take/

所以我遵循了提供的建议并尝试了巨大的差异。我很清楚,这与 row_number 的计算方式有些相关,但我不清楚究竟发生了什么以及为什么两个查询之间存在如此大的差异。

原始慢查询(约 7K 个元素的数据集,耗时约 3 秒):

SELECT [t7].[ID], [t7].[ID_BRAND], [t7].[CODE], [t7].[CODFOR], [t7].[COD_ALT01], [t7].[COD_ALT02], [t7].[COD_ALT03], [t7].[ID_UOM], [t7].[IS_ACTIVE], [t7].[_ATTRIBUTES] AS [_ATTRIBUTES], [t7].[_DOCUMENTS] AS [_DOCUMENTS], [t7].[_SEO] AS [_SEO], [t7].[_TRANSLATIONS] AS [_TRANSLATIONS], [t7].[_TAGS] AS [_TAGS], [t7].[_NOTES] AS [_NOTES], [t7].[_METADATA] AS [_METADATA], [t7].[IS_B2B], [t7].[IS_B2C], [t7].[IS_PROMO], [t7].[IS_NEWS], [t7].[CAN_BE_RETURNED], [t7].[IS_SHIPPABLE], [t7].[HAS_SHIPPING_COSTS], [t7].[IS_PURCHEASABLE], [t7].[test], [t7].[ID2], [t7].[CODE2], [t7].[BUSINESS_NAME], [t7].[NAME], [t7].[PHONE_01], [t7].[PHONE_02], [t7].[PHONE_03], [t7].[FAX_01], [t7].[FAX_02], [t7].[COUNTRY_01], [t7].[CITY_01], [t7].[ADDRESS_01], [t7].[COUNTRY_02], [t7].[CITY_02], [t7].[ADDRESS_02], [t7].[EMAIL_01], [t7].[EMAIL_02], [t7].[PEC], [t7].[SITE_01], [t7].[SITE_02], [t7].[SITE_03], [t7].[SITE_04], [t7].[VAT_NUMBER], [t7].[SORT], [t7].[GROUPID_01], [t7].[IS_GROUPLEADER_01], [t7].[GROUPID_02], [t7].[IS_GROUPLEADER_02],[t7].[IS_ACTIVE2], [t7].[[_DOCUMENTS]]2] AS [_DOCUMENTS2], [t7].[[_SEO]]2] AS [_SEO2], [t7].[[_METADATA]]2] AS [_METADATA2], [t7].[test2], [t7].[ID3], [t7].[CODE3], [t7].[[_TRANSLATIONS]]2] AS [_TRANSLATIONS2], [t7].[[_METADATA]]3] AS [_METADATA3], [t7].[test3], [t7].[ID4], [t7].[ID_LINE], [t7].[ID_GROUP], [t7].[ID_CLASS], [t7].[ID_FAM], [t7].[ID_ARTICLE]
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY [t0].[ID], [t0].[ID_BRAND], [t0].[CODE], [t0].[CODFOR], [t0].[COD_ALT01], [t0].[COD_ALT02], [t0].[COD_ALT03], [t0].[ID_UOM], [t0].[IS_ACTIVE], [t0].[_ATTRIBUTES], [t0].[_DOCUMENTS], [t0].[_SEO], [t0].[_TRANSLATIONS], [t0].[_TAGS], [t0].[_NOTES], [t0].[_METADATA], [t0].[IS_B2B], [t0].[IS_B2C], [t0].[IS_PROMO], [t0].[IS_NEWS], [t0].[CAN_BE_RETURNED], [t0].[IS_SHIPPABLE], [t0].[HAS_SHIPPING_COSTS], [t0].[IS_PURCHEASABLE], [t2].[test], [t2].[ID], [t2].[CODE], [t2].[BUSINESS_NAME], [t2].[NAME], [t2].[PHONE_01], [t2].[PHONE_02], [t2].[PHONE_03], [t2].[FAX_01], [t2].[FAX_02], [t2].[COUNTRY_01], [t2].[CITY_01], [t2].[ADDRESS_01], [t2].[COUNTRY_02], [t2].[CITY_02], [t2].[ADDRESS_02], [t2].[EMAIL_01], [t2].[EMAIL_02], [t2].[PEC], [t2].[SITE_01], [t2].[SITE_02], [t2].[SITE_03], [t2].[SITE_04], [t2].[VAT_NUMBER], [t2].[SORT], [t2].[GROUPID_01], [t2].[IS_GROUPLEADER_01], [t2].[GROUPID_02], [t2].[IS_GROUPLEADER_02], [t2].[IS_ACTIVE], [t2].[_DOCUMENTS], [t2].[_SEO], [t2].[_METADATA], [t4].[test], [t4].[ID], [t4].[CODE], [t4].[_TRANSLATIONS], [t4].[_METADATA], [t6].[test], [t6].[ID], [t6].[ID_LINE], [t6].[ID_GROUP], [t6].[ID_CLASS], [t6].[ID_FAM], [t6].[ID_ARTICLE]) AS [ROW_NUMBER], [t0].[ID], [t0].[ID_BRAND], [t0].[CODE], [t0].[CODFOR], [t0].[COD_ALT01], [t0].[COD_ALT02], [t0].[COD_ALT03], [t0].[ID_UOM], [t0].[IS_ACTIVE], [t0].[_ATTRIBUTES], [t0].[_DOCUMENTS], [t0].[_SEO], [t0].[_TRANSLATIONS], [t0].[_TAGS], [t0].[_NOTES], [t0].[_METADATA], [t0].[IS_B2B], [t0].[IS_B2C], [t0].[IS_PROMO], [t0].[IS_NEWS], [t0].[CAN_BE_RETURNED], [t0].[IS_SHIPPABLE], [t0].[HAS_SHIPPING_COSTS], [t0].[IS_PURCHEASABLE], [t2].[test], [t2].[ID] AS [ID2], [t2].[CODE] AS [CODE2], [t2].[BUSINESS_NAME], [t2].[NAME], [t2].[PHONE_01], [t2].[PHONE_02], [t2].[PHONE_03], [t2].[FAX_01], [t2].[FAX_02], [t2].[COUNTRY_01], [t2].[CITY_01], [t2].[ADDRESS_01], [t2].[COUNTRY_02], [t2].[CITY_02], [t2].[ADDRESS_02], [t2].[EMAIL_01], [t2].[EMAIL_02], [t2].[PEC], [t2].[SITE_01], [t2].[SITE_02], [t2].[SITE_03], [t2].[SITE_04], [t2].[VAT_NUMBER], [t2].[SORT], [t2].[GROUPID_01], [t2].[IS_GROUPLEADER_01], [t2].[GROUPID_02], [t2].[IS_GROUPLEADER_02], [t2].[IS_ACTIVE] AS [IS_ACTIVE2], [t2].[_DOCUMENTS] AS [[_DOCUMENTS]]2], [t2].[_SEO] AS [[_SEO]]2], [t2].[_METADATA] AS [[_METADATA]]2], [t4].[test] AS [test2], [t4].[ID] AS [ID3], [t4].[CODE] AS [CODE3], [t4].[_TRANSLATIONS] AS [[_TRANSLATIONS]]2], [t4].[_METADATA] AS [[_METADATA]]3], [t6].[test] AS [test3], [t6].[ID] AS [ID4], [t6].[ID_LINE], [t6].[ID_GROUP], [t6].[ID_CLASS], [t6].[ID_FAM], [t6].[ID_ARTICLE]
    FROM [dbo].[tbl_ana_Articles] AS [t0]
    LEFT OUTER JOIN (
        SELECT 1 AS [test], [t1].[ID], [t1].[CODE], [t1].[BUSINESS_NAME], [t1].[NAME], [t1].[PHONE_01], [t1].[PHONE_02], [t1].[PHONE_03], [t1].[FAX_01], [t1].[FAX_02], [t1].[COUNTRY_01], [t1].[CITY_01], [t1].[ADDRESS_01], [t1].[COUNTRY_02], [t1].[CITY_02], [t1].[ADDRESS_02], [t1].[EMAIL_01], [t1].[EMAIL_02], [t1].[PEC], [t1].[SITE_01], [t1].[SITE_02], [t1].[SITE_03], [t1].[SITE_04], [t1].[VAT_NUMBER], [t1].[SORT], [t1].[GROUPID_01], [t1].[IS_GROUPLEADER_01], [t1].[GROUPID_02], [t1].[IS_GROUPLEADER_02], [t1].[IS_ACTIVE], [t1].[_DOCUMENTS], [t1].[_SEO], [t1].[_METADATA]
        FROM [dbo].[tbl_ana_Brands] AS [t1]
        ) AS [t2] ON [t2].[ID] = [t0].[ID_BRAND]
    LEFT OUTER JOIN (
        SELECT 1 AS [test], [t3].[ID], [t3].[CODE], [t3].[_TRANSLATIONS], [t3].[_METADATA]
        FROM [dbo].[tbl_ana_UoMs] AS [t3]
        ) AS [t4] ON [t4].[ID] = [t0].[ID_UOM]
    LEFT OUTER JOIN (
        SELECT 1 AS [test], [t5].[ID], [t5].[ID_LINE], [t5].[ID_GROUP], [t5].[ID_CLASS], [t5].[ID_FAM], [t5].[ID_ARTICLE]
        FROM [dbo].[tbl_src_ArticlesCategories] AS [t5]
        ) AS [t6] ON [t6].[ID_ARTICLE] = [t0].[ID]
    WHERE (
        (CASE 
            WHEN 1 = 1 THEN CONVERT(Int,[t0].[IS_ACTIVE])
            ELSE 0
         END)) = 1
    ) AS [t7]
WHERE [t7].[ROW_NUMBER]  BETWEEN 7272 + 1 AND 7284
ORDER BY [t7].[ROW_NUMBER]

这里慢查询执行计划:https ://www.brentozar.com/pastetheplan/?id=Sk-rLnY3F

修订后的快速查询(约 7K 元素的数据集,占用约 0 秒):

SELECT [t7].[ID], [t7].[ID_BRAND], [t7].[CODE], [t7].[CODFOR], [t7].[COD_ALT01], [t7].[COD_ALT02], [t7].[COD_ALT03], [t7].[ID_UOM], [t7].[IS_ACTIVE], [t7].[_ATTRIBUTES] AS [_ATTRIBUTES], [t7].[_DOCUMENTS] AS [_DOCUMENTS], [t7].[_SEO] AS [_SEO], [t7].[_TRANSLATIONS] AS [_TRANSLATIONS], [t7].[_TAGS] AS [_TAGS], [t7].[_NOTES] AS [_NOTES], [t7].[_METADATA] AS [_METADATA], [t7].[IS_B2B], [t7].[IS_B2C], [t7].[IS_PROMO], [t7].[IS_NEWS], [t7].[CAN_BE_RETURNED], [t7].[IS_SHIPPABLE], [t7].[HAS_SHIPPING_COSTS], [t7].[IS_PURCHEASABLE], [t7].[test], [t7].[ID2], [t7].[CODE2], [t7].[BUSINESS_NAME], [t7].[NAME], [t7].[PHONE_01], [t7].[PHONE_02], [t7].[PHONE_03], [t7].[FAX_01], [t7].[FAX_02], [t7].[COUNTRY_01], [t7].[CITY_01], [t7].[ADDRESS_01], [t7].[COUNTRY_02], [t7].[CITY_02], [t7].[ADDRESS_02], [t7].[EMAIL_01], [t7].[EMAIL_02], [t7].[PEC], [t7].[SITE_01], [t7].[SITE_02], [t7].[SITE_03], [t7].[SITE_04], [t7].[VAT_NUMBER], [t7].[SORT], [t7].[GROUPID_01], [t7].[IS_GROUPLEADER_01], [t7].[GROUPID_02], [t7].[IS_GROUPLEADER_02],[t7].[IS_ACTIVE2], [t7].[[_DOCUMENTS]]2] AS [_DOCUMENTS2], [t7].[[_SEO]]2] AS [_SEO2], [t7].[[_METADATA]]2] AS [_METADATA2], [t7].[test2], [t7].[ID3], [t7].[CODE3], [t7].[[_TRANSLATIONS]]2] AS [_TRANSLATIONS2], [t7].[[_METADATA]]3] AS [_METADATA3], [t7].[test3], [t7].[ID4], [t7].[ID_LINE], [t7].[ID_GROUP], [t7].[ID_CLASS], [t7].[ID_FAM], [t7].[ID_ARTICLE]
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY [t0].[ID]) AS [ROW_NUMBER], [t0].[ID], [t0].[ID_BRAND], [t0].[CODE], [t0].[CODFOR], [t0].[COD_ALT01], [t0].[COD_ALT02], [t0].[COD_ALT03], [t0].[ID_UOM], [t0].[IS_ACTIVE], [t0].[_ATTRIBUTES], [t0].[_DOCUMENTS], [t0].[_SEO], [t0].[_TRANSLATIONS], [t0].[_TAGS], [t0].[_NOTES], [t0].[_METADATA], [t0].[IS_B2B], [t0].[IS_B2C], [t0].[IS_PROMO], [t0].[IS_NEWS], [t0].[CAN_BE_RETURNED], [t0].[IS_SHIPPABLE], [t0].[HAS_SHIPPING_COSTS], [t0].[IS_PURCHEASABLE], [t2].[test], [t2].[ID] AS [ID2], [t2].[CODE] AS [CODE2], [t2].[BUSINESS_NAME], [t2].[NAME], [t2].[PHONE_01], [t2].[PHONE_02], [t2].[PHONE_03], [t2].[FAX_01], [t2].[FAX_02], [t2].[COUNTRY_01], [t2].[CITY_01], [t2].[ADDRESS_01], [t2].[COUNTRY_02], [t2].[CITY_02], [t2].[ADDRESS_02], [t2].[EMAIL_01], [t2].[EMAIL_02], [t2].[PEC], [t2].[SITE_01], [t2].[SITE_02], [t2].[SITE_03], [t2].[SITE_04], [t2].[VAT_NUMBER], [t2].[SORT], [t2].[GROUPID_01], [t2].[IS_GROUPLEADER_01], [t2].[GROUPID_02], [t2].[IS_GROUPLEADER_02], [t2].[IS_ACTIVE] AS [IS_ACTIVE2], [t2].[_DOCUMENTS] AS [[_DOCUMENTS]]2], [t2].[_SEO] AS [[_SEO]]2], [t2].[_METADATA] AS [[_METADATA]]2], [t4].[test] AS [test2], [t4].[ID] AS [ID3], [t4].[CODE] AS [CODE3], [t4].[_TRANSLATIONS] AS [[_TRANSLATIONS]]2], [t4].[_METADATA] AS [[_METADATA]]3], [t6].[test] AS [test3], [t6].[ID] AS [ID4], [t6].[ID_LINE], [t6].[ID_GROUP], [t6].[ID_CLASS], [t6].[ID_FAM], [t6].[ID_ARTICLE]
    FROM [dbo].[tbl_ana_Articles] AS [t0]
    LEFT OUTER JOIN (
        SELECT 1 AS [test], [t1].[ID], [t1].[CODE], [t1].[BUSINESS_NAME], [t1].[NAME], [t1].[PHONE_01], [t1].[PHONE_02], [t1].[PHONE_03], [t1].[FAX_01], [t1].[FAX_02], [t1].[COUNTRY_01], [t1].[CITY_01], [t1].[ADDRESS_01], [t1].[COUNTRY_02], [t1].[CITY_02], [t1].[ADDRESS_02], [t1].[EMAIL_01], [t1].[EMAIL_02], [t1].[PEC], [t1].[SITE_01], [t1].[SITE_02], [t1].[SITE_03], [t1].[SITE_04], [t1].[VAT_NUMBER], [t1].[SORT], [t1].[GROUPID_01], [t1].[IS_GROUPLEADER_01], [t1].[GROUPID_02], [t1].[IS_GROUPLEADER_02], [t1].[IS_ACTIVE], [t1].[_DOCUMENTS], [t1].[_SEO], [t1].[_METADATA]
        FROM [dbo].[tbl_ana_Brands] AS [t1]
        ) AS [t2] ON [t2].[ID] = [t0].[ID_BRAND]
    LEFT OUTER JOIN (
        SELECT 1 AS [test], [t3].[ID], [t3].[CODE], [t3].[_TRANSLATIONS], [t3].[_METADATA]
        FROM [dbo].[tbl_ana_UoMs] AS [t3]
        ) AS [t4] ON [t4].[ID] = [t0].[ID_UOM]
    LEFT OUTER JOIN (
        SELECT 1 AS [test], [t5].[ID], [t5].[ID_LINE], [t5].[ID_GROUP], [t5].[ID_CLASS], [t5].[ID_FAM], [t5].[ID_ARTICLE]
        FROM [dbo].[tbl_src_ArticlesCategories] AS [t5]
        ) AS [t6] ON [t6].[ID_ARTICLE] = [t0].[ID]
    WHERE (
        (CASE 
            WHEN 1 = 1 THEN CONVERT(Int,[t0].[IS_ACTIVE])
            ELSE 0
         END)) = 1
    ) AS [t7]
WHERE [t7].[ROW_NUMBER] BETWEEN 7272 + 1 AND 7284
ORDER BY [t7].[ROW_NUMBER]

这里是快速查询执行计划:https ://www.brentozar.com/pastetheplan/?id=B10l82K2Y

注意:所有查询代码均由 ORM 自动生成

这两个查询看起来非常相似,我不清楚是什么显着提高了性能。我真的很感谢对 SQL Server 有这么大帮助的提示,这样我就可以更好地理解将来如何调整 ORM。

sql-server performance-tuning
  • 1 个回答
  • 932 Views
Martin Hope
Skary
Asked: 2021-12-03 06:30:44 +0800 CST

SQL Server如何将大json上传到列中,性能问题

  • 1

当 nvarchar(max) 列具有几 MB 数据时,我在表上的单行插入/更新语句上遇到性能不佳的问题。

这是我的表结构:

CREATE TABLE [dbo].[tbl_set_Cart](
    [ID] [int] NOT NULL,
    [AS400_CUSTOMER_COD] [nvarchar](50) NOT NULL,
    [AS400_LISTIN] [int] NOT NULL,
    [VALUE] [nvarchar](max) NOT NULL,
    [DELIVERY_COSTS] [nvarchar](max) NOT NULL,
    [ITEMS_COUNT] [int] NOT NULL,
    [ITEMS] [nvarchar](max) NOT NULL,
    [KIND] [int] NOT NULL,
    [CHECKOUT_INFO] [nvarchar](max) NOT NULL,
    [ISSUES] [nvarchar](max) NOT NULL,
    [LAST_CHECK] [datetime] NOT NULL,
    [USER_ID] [int] NOT NULL,
    [IMPERSONATED_USER_ID] [int] NOT NULL,
    [OVERRIDE_PRICES] [bit] NOT NULL,
    [HAS_ISSUE] [bit] NOT NULL,
    [IS_CONFIRMED] [bit] NOT NULL,
    [IS_COLLECTED] [bit] NOT NULL,
    [_METADATA] [nvarchar](max) NOT NULL,
 CONSTRAINT [PK_tbl_set_Cart] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

这里是一个更新语句的例子

DECLARE @p0 AS INT = [cart_id];
DECLARE @p1 AS INT = [entry_count];
DECLARE @p2 AS NVARCHAR(MAX) = '..document..' --~8MB;

UPDATE [dbo].[tbl_set_Cart]
SET [ITEMS_COUNT] = @p1, [ITEMS] = @p2
WHERE [ID] = @p0

在数据库的同一台机器上执行这个命令(一个开发环境,所以没有其他工作负载)我得到了这个性能:

在此处输入图像描述

将文本加载到 SQL Server 中这么慢真的让我感到惊讶,所以我要问的是是否有更好的方法来实现这一点。

该文档是一个大的 JSON,不会超过 10MB 的数据(我已经在最坏的情况下完成了上面报告的基准测试),如果性能提高,我将其转换为 BLOB 或其他数据结构没有问题。如果这是一个更好的主意,我还可以使用存储过程来上传大文本。

环境:

Windows Server 2019 16 逻辑处理器 2,1 GHz 和 Microsoft SQL Server Standard(64 位)版本 15.0.2070.41,具有 4GB 预留 RAM,16 核许可。

(这是一个仅限开发的环境,在这种情况下,我是唯一一个没有其他程序或计划活动运行的人。)

我在这里再次测试了一个不同的购物车(一个小一点的)(客户统计数据)和执行计划。

在此处输入图像描述

链接在这里:https ://www.brentozar.com/pastetheplan/?id=SJcPhDUFK

在此处输入图像描述

如果我插入一个新行,它会更快:

在此处输入图像描述

链接在这里:https ://www.brentozar.com/pastetheplan/?id=S1FDjD8KF

在此处输入图像描述

对于插入语句,我使用了 SQL Server 生成的数据(任务 -> 脚本表 -> 仅限数据)

我期望实现的是更新时间 <0,5s

在我的场景中,json 通常出生时很小,然后每天都在增加,直到我正在测试的大小。我可以开始考虑将它们存储为文件吗?

我在日志文件中预先分配了空间。并再次检查恢复模式是否设置为简单。我可以做些什么来进一步提高性能?

sql-server update
  • 2 个回答
  • 757 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve