如标题所述,我开始对表查询进行性能调整,该查询使用由使用 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) 我必须承认我不是 DBA,但我需要维护一个 SQL Server 实例,并且存储过程权限链几乎没有问题(希望条款是正确的)。
为了简要解释我的需求,我有一个用户应该只在一个数据库上授予权限,该数据库应该运行一个存储过程(在该“授予”数据库上),该存储过程包含对外部数据库的引用(我应该继承一些授予)
详细来说,我的情况是我有三个数据库
所以我有三个用户
到目前为止一切顺利,暂存过程完成其工作,并在完成后写入信号量(通知数据已准备好)。有时,应用程序(使用最终用户)会检查信号量并将所有数据提取到最终数据库中。
现在我必须支持快速、按需的暂存过程(由于其他原因我仍然需要从暂存数据库执行),该过程完成后,应直接将数据更新到最终数据库中。
我已经编写了这样的过程,一切都按预期工作,但我必须将 FinalDB 上的读/写操作授予暂存用户,我不喜欢它。有许多应用程序使用临时用户,其中一些应用程序不在“我的控制之下”,因此我不希望将数据写入临时数据库的错误应用程序最终会弄乱最终数据库。我可以接受我的新的按需暂存过程可能很关键(并且最终会弄乱最终数据库)。
所以问题是,暂存用户已被授予执行存储过程(EG:OnDemandUpdate)的权限,因为它是暂存数据库的一部分,但包含对外部表(来自最终数据库)的插入/更新,并且我希望该授权可以是被束缚。我怎样才能做到这一点?
我必须承认我是一名程序员,即使我没有相同的背景,我也正在努力学习一些有关 DBA 的知识。我试图了解 SQL Server 上的安全性提供了什么以及如何使用静态数据加密。
我的问题是,如果托管 SQL Server 实例的计算机遭到未经授权的访问,加密将如何保护数据?我的猜测根本不是。
我的意思是,假设 SQL Server 在放置在数据中心并“连接”到互联网的虚拟机上运行。如果攻击者将获得虚拟机的控制权,那么我认为静态数据保护的作用就很小。
事实上,攻击者可以获得管理员权限(作为操作系统用户),重置 SQL Server 凭据并以“sa”身份登录,然后即使 SQL Server 文件通常是加密的,他也可以以纯文本格式导出它们。
在这种情况下,是否有任何方法可以保护 SQL Server 的安全,或者如果操作系统级别遭到破坏,SQL Server 将被视为“丢失”?
最近我发现(我必须声明我不是 DBA)可以在 SQL Serve 属性中配置超时(适用于 SQL Server 实例中的所有数据库):
忽略图片显示0超时(我正在实验,不会是最终配置);我很困惑,因为我知道应该将超时配置到连接到 SQL Server 实例的客户端中(连接超时和命令超时)。
现在我想知道如果 SQL Sever 配置规定超时为 10 分钟并且客户端使用 20 分钟的连接字符串(命令和连接)进行连接,会发生什么情况。应用哪种超时?
当 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) 我需要编写一个存储过程来更新数据库中的链接引用。链接可以包含在几个包含 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 ×6
json ×1
linq ×1
pagination ×1
permissions ×1
replace ×1
security ×1
t-sql ×1
timeout ×1
transparent-data-encryption ×1
update ×1