标签: sql-server

EXEC 与 SP_EXECUTESQL 性能

最近我们对我们的数据库使用了一个 sql 代码审查工具。建议使用SP_EXECUTESQL代替EXEC.

我知道SP_EXECUTESQL可以帮助我们避免 sql 注入。使用EXECvs时性能有什么不同吗SP_EXECUTESQL

performance sql-server dynamic-sql t-sql exec query-performance

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

快速有效地删除数据库并删除所有文件的最佳方法?

如果我将 Microsoft SQL Server 数据库设置为脱机并删除它,它将被删除,但日志和数据文件将保留。如果我在联机模式下执行此操作,则另一个连接可能会阻止我删除它。在开发环境中,或者对于我想定期清理并在生产环境中重新创建的数据库,清理数据库及其数据文件和日志文件的最佳 T-SQL 命令序列是什么,它会一直工作因为我有 sa 权限并且没有人恶意阻止我删除数据库?

sql-server t-sql

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

更新 18 TB 数据库的统计信息

我在这里寻找专家关于如何管理大约 18 TB 的非常大的数据库的更新统计信息的建议。

我们最近开始面临性能问题,并认为这是由于旧的统计数据造成的。

实际上,我们有一个作业运行 exec sp_update stats 并以默认采样率更新,在我们的例子中为 1.2%。所以我们必须手动更新统计数据并看到一些改进。

我相信安排 FULL SCAN 将是一个挑战。据我所知,我正在将行与采样的行进行比较。例如,在一张大小为 400 GB 且行数超过 100M 的表上,我可以看到采样行约为 2 到 4M。大表是分区的。

我们使用的是 SQL Server 2012 企业版。未启用跟踪标志 2371。

请建议我如何为如此大的数据库以更好的方式更新统计数据以及如何使用该采样率?

sql-server statistics index-tuning sql-server-2012

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

JOIN FOR SYSTEM TIME 以列作为有效系统时间

想象一下,我有一个模式,其中包括ProductsOrders,和OrderLineItems,与Products作为一个系统版本态表。

架构:

CREATE TABLE dbo.Products
(
    ProductID INT NOT NULL IDENTITY PRIMARY KEY,
    Name nvarchar(255) not null,
    SysStart DATETIME2 (7) GENERATED ALWAYS AS ROW START NOT NULL,
    SysEnd DATETIME2 (7) GENERATED ALWAYS AS ROW END NOT NULL,
    PERIOD FOR SYSTEM_TIME ([SysStart], [SysEnd])
)
WITH (SYSTEM_VERSIONING = ON(HISTORY_TABLE = dbo.Products_History, DATA_CONSISTENCY_CHECK = ON));
GO

CREATE TABLE dbo.Orders
(
    OrderID int not null identity primary key,
    OrderDate datetime2 (7) not null
);

CREATE TABLE …
Run Code Online (Sandbox Code Playgroud)

sql-server temporal-tables sql-server-2016

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

SQLCMD 模式下另一个变量内的变量

尝试使用 SQLCMD 模式整理我的 SQL 脚本时遇到了一个问题:

:setvar db_suffix "some_suffix"
:setvar some_db "some_db_$(db_suffix)"
print 'some_db: $(some_db)'
Run Code Online (Sandbox Code Playgroud)

其输出是:

some_db: some_db_$(db_suffix)
Run Code Online (Sandbox Code Playgroud)

然而,我的预期是:

some_db: some_db_some_suffix
Run Code Online (Sandbox Code Playgroud)

有没有办法像这样进行变量插值?

(请注意,诸如此类的 T-SQL 函数CONCAT()将不起作用,因为我将使用该变量作为数据库名称)。

sql-server scripting sqlcmd

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

链接 SQL Server 有哪些重大限制?

我们的产品基于 Microsoft SQL Server。目前,我们使用了三个数据库,并且始终将它们部署在一个 SQL Server 实例上。

这三个数据库是OLTP、OLAP和审计。OLAP 数据库有大量来自 OLTP 和审计的 EOD 入站数据,使用跨数据库查询。

问题

如果我们将这三个数据库部署到单个物理服务器内的三个独立的标准版实例上,并使用 SQL Server 的链接服务器功能将它们绑定在一起:

  1. 它对应用程序代码有多透明?我应该期待多少变化?
  2. 到 OLAP 的入站数据为 50k-100k 行,每个 EOD 的有效负载为 200-500MB。我应该期望多少性能下降?
  3. 我应该期待哪些其他重大限制?

背景

目前,我们正在向拥有 500 多个并发用户的潜在客户进行宣传。

我们正在起草服务器规范,其中包括 64 个内核和 256GB RAM。为了让 SQL Server 能够利用所有这些丰富的资源,客户必须购买企业版,而对于 SQL Server 2016,它仅在基于每核的许可中可用。

我们担心仅许可成本(64 x 7400 美元)就会让他们失望。所以我想把数据库拆分成三个标准版的实例,并把它们链接在一起,希望链接功能对应用程序代码是透明的。

performance sql-server linked-server sql-server-2016

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

防止动态 SQL 中的 SQL 注入

让我们想象一个存储过程,它检索数据并进行某种分页。这个过程有一些输入,描述了我们想要的数据集以及我们如何对其进行排序。

这是一个非常简单的查询,但让我们以它为例。

create table Persons(id int, firstName varchar(50), lastName varchar(50))
go
create procedure GetPersons @pageNumber int = 1, @pageSize int = 20, @orderBy varchar(50) = 'id', @orderDir varchar(4) = 'desc'
as

declare @sql varchar(max)
set @sql = 'select id, firstName, lastName
from (
    select id, firstName, LastName, row_number() over(order by '+@orderBy+' '+@orderDir+') as rn
    from Persons
    ) t
where rn > ('+cast(@pageNumber as varchar)+'-1) * '+cast(@pageSize as varchar)+'
        and rn <= '+cast(@pageNumber as varchar)+' * '+cast(@pageSize as varchar)+' 
order by …
Run Code Online (Sandbox Code Playgroud)

security sql-server

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

使用加窗函数优化子查询

由于我的性能调优技巧似乎永远不够用,我总是想知道我是否可以针对某些查询执行更多优化。此问题涉及的情况是嵌套在子查询中的 Windowed MAX 函数。

我正在挖掘的数据是对不同组较大集的一系列事务。我有 4 个重要的字段,交易的唯一 ID,一批交易的组 ID,以及与各自唯一交易或交易组相关的日期。大多数情况下,集团日期与批次的最大唯一交易日期相匹配,但有时会通过我们的系统进行手动调整,并在捕获集团交易日期后进行唯一日期操作。此手动编辑不会按设计调整组日期。

我在此查询中确定的是唯一日期落在组日期之后的那些记录。以下示例查询构建了与我的场景大致相当的内容,SELECT 语句返回我正在查找的记录,但是,我是否以最有效的方式接近此解决方案?这需要一段时间才能在我的事实表加载期间运行,因为我的记录计数在前 9 位数字中,但主要是我对子查询的蔑视让我想知道这里是否有更好的方法。我并不关心任何索引,因为我相信它们已经到位;我正在寻找的是一种替代查询方法,它可以实现相同的目标,但效率更高。欢迎任何反馈。

CREATE TABLE #Example
(
    UniqueID INT IDENTITY(1,1)
  , GroupID INT
  , GroupDate DATETIME
  , UniqueDate DATETIME
)

CREATE CLUSTERED INDEX [CX_1] ON [#Example]
(
    [UniqueID] ASC
)


SET NOCOUNT ON

--Populate some test data
DECLARE @i INT = 0, @j INT = 5, @UniqueDate DATETIME, @GroupDate DATETIME

WHILE @i < 10000
BEGIN

    IF((@i + @j)%173 = 0)
    BEGIN
        SET @UniqueDate = GETDATE()+@i+5
    END
    ELSE
    BEGIN …
Run Code Online (Sandbox Code Playgroud)

performance sql-server sql-server-2012 window-functions query-performance

9
推荐指数
3
解决办法
5835
查看次数

在不使用 CLR 的情况下创建数据库级常量(枚举)?

我有几个 SQL 对象,它们需要根据请求的所需状态采取备用操作。有没有办法创建可以传递给存储过程、表值函数并在查询中使用(不使用 CLR)的数据库级常量(枚举)?

CREATE PROCEDURE dbo.DoSomeWork(@param1 INTEGER, ..., @EnumValue myEnumType)  AS ...;
Run Code Online (Sandbox Code Playgroud)

然后使用它:

EXEC doSomeWork 85, ..., (myEnumType.EnumValue1 + myEnumType.EnumValue2);
Run Code Online (Sandbox Code Playgroud)

哪里myEnumType会保存一些枚举值。

在该过程中,我将能够使用@EnumValue它并针对其中的值对其进行测试myEnumType以完成所需的工作。我会myEnumType为我正在考虑的情况设置位掩码的值。

举一个简单的例子,考虑一个昂贵的过程,它需要一个巨大的数据集,并将其缩减为一个较小但仍然非常大的数据集。在这个过程中,您需要在该过程中进行一些会影响结果的调整。假设这是根据减少中的中间计算的某些状态过滤(或反对)某些类型的记录。该@EnumValue类型的myEnumType可以用来测试此

SELECT   ...
FROM     ...
WHERE       (@EnumValue & myEnumType.EnumValue1 = myEnumType.EnumValue1 AND ...)
        OR  (@EnumValue & myEnumType.EnumValue2 = myEnumType.EnumValue2 AND ...)
        OR  ...
Run Code Online (Sandbox Code Playgroud)

在不使用 CLR 的情况下,SQL Server 中是否可以使用这些类型的数据库级常量?

我正在寻找可以作为参数传递给存储过程、函数等的数据库级枚举或常量集。

sql-server enum sql-server-2016

9
推荐指数
3
解决办法
1639
查看次数

SQL Server --&gt; Informix DB 链接服务器

经过大约 3 天的尝试,我无法创建从 SQL Server 2016 到 Informix 11.5 的链接服务器。我没有在其他版本(2008R2 等)上尝试过这个,因为我想先在测试环境中设置连接。

我做了什么

1) 将 IBM Informix指令与 OLE DB 提供程序一起使用,在其中我收到以下错误(无论我是否在提供程序字符串中使用 DNS):

无法为链接服务器“UCCX”初始化 OLE DB 提供程序“Ifxoledbc”的数据源对象。链接服务器“UCCX”的 OLE DB 提供程序“Ifxoledbc”返回消息“EIX000: (-23197)”数据库区域设置信息不匹配”(Microsoft SQL Server,错误:7303)

DB Locale 是 en_US.57372

2)如本博客所述,使用 Microsoft OLE DB Provider for SQL Server返回错误:

命名管道提供程序:无法打开与 SQL Server 的连接。链接服务器 UCCX 的 OLE DB 提供程序 SQLNCLI11 返回消息“登录超时已过期” 链接服务器 UCCX …

sql-server linked-server informix sql-server-2016

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