小编Ska*_*ary的帖子

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

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

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

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

原始慢查询(〜7K元素的数据集,需要〜3s):

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], …
Run Code Online (Sandbox Code Playgroud)

sql-server linq performance-tuning pagination

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

SQL Server 允许存储过程链接

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

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

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

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

所以我有三个用户

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

到目前为止一切顺利,暂存过程完成其工作,并在完成后写入信号量(通知数据已准备好)。有时,应用程序(使用最终用户)会检查信号量并将所有数据提取到最终数据库中。

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

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

所以问题是,暂存用户已被授予执行存储过程(EG:OnDemandUpdate)的权限,因为它是暂存数据库的一部分,但包含对外部表(来自最终数据库)的插入/更新,并且我希望该授权可以是被束缚。我怎样才能做到这一点?

sql-server stored-procedures permissions

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

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

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

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

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

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

在这种情况下,是否有任何方法可以保护 SQL Server 的安全,或者如果操作系统级别遭到破坏,SQL Server 将被视为“丢失”?

security sql-server transparent-data-encryption

4
推荐指数
1
解决办法
123
查看次数

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

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

在此输入图像描述

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

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

sql-server configuration timeout

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

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

当 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 …
Run Code Online (Sandbox Code Playgroud)

sql-server update json performance-tuning

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

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

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

为此,我每次迭代分批更新表 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 …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures t-sql replace

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