标签: sql-server

授予运行 SQL 服务器作业的权限

我在 MSSQL Server 2005 上有一份工作,我想允许任何数据库用户运行。

我不担心安全性,因为作业实际工作的输入来自数据库表。只是运行作业,而不向该表添加记录将什么都不做。

我只是找不到如何授予这项工作的公共权限。

有没有办法做到这一点?在这一点上我唯一能想到的就是让工作不断地运行(或按计划),但因为它只需要很少(可能每几个月一次)做任何实际工作,而且我确实希望工作是一旦存在就完成,这似乎不是最佳解决方案。

sql-server-2005 security sql-server permissions

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

CREATE DATABASE 与 CREATE ANY DATABASE 权限

在 Microsoft SQL Server 中,CREATE DATABASECREATE ANY DATABASE权限有什么区别?

我找不到权威的答案。我能推断出的最好结果是 (a)CREATE ANY暗示我可以创建由另一个用户拥有的数据库,而CREATE我不能,或者 (b) Sybase/早期 SQL Server 时代的原始权限曾经CREATE ANY并且CREATE被别名为ANSI 一致性。

sql-server permissions

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

什么是多维数据集中的度量和维度

我对 Microsoft Sql Server 商业智能非常陌生Analysis Service(但我使用 SQL Server 编程多年)。有人能用简单的语言描述多维数据集中的度量和维度吗(如果可以的)?

谢谢

sql-server ssas business-intelligence

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

禁止 SSMS 提示保存更改

保存对以下项目的更改

是否可以配置 SQL Server Management Studio (SSMS)。以便在关闭未保存的查询窗口时不出现上面显示的对话框?

sql-server-2008 sql-server ssms

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

为什么这个查询不使用索引假脱机?

我问这个问题是为了更好地了解优化器的行为并了解索引假脱机的限制。假设我将 1 到 10000 之间的整数放入堆中:

CREATE TABLE X_10000 (ID INT NOT NULL);
truncate table X_10000;

INSERT INTO X_10000 WITH (TABLOCK)
SELECT TOP 10000 ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
Run Code Online (Sandbox Code Playgroud)

并强制嵌套循环连接MAXDOP 1

SELECT *
FROM X_10000 a
INNER JOIN X_10000 b ON a.ID = b.ID
OPTION (LOOP JOIN, MAXDOP 1);
Run Code Online (Sandbox Code Playgroud)

这是对 SQL Server 采取的相当不友好的操作。当两个表都没有任何相关索引时,嵌套循环连接通常不是一个好的选择。这是计划:

错误查询

在我的机器上查询需要 13 秒,从 table spool 中提取了 100000000 行。但是,我不明白为什么查询必须很慢。查询优化器能够通过索引假脱机动态创建索引。这个查询似乎是索引假脱机的完美候选者。

以下查询返回与第一个相同的结果,具有索引假脱机,并且在不到一秒的时间内完成:

SELECT *
FROM X_10000 a
CROSS APPLY …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization index-spool sql-server-2016

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

为什么不使用 IS NULL 值上的过滤索引?

假设我们有一个像这样的表定义:

CREATE TABLE MyTab (
    ID INT IDENTITY(1,1) CONSTRAINT PK_MyTab_ID PRIMARY KEY
    ,GroupByColumn NVARCHAR(10) NOT NULL
    ,WhereColumn DATETIME NULL
    )
Run Code Online (Sandbox Code Playgroud)

还有一个过滤的非聚集索引,如下所示:

CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn ON MyTab 
    (GroupByColumn)
WHERE (WhereColumn IS NULL) 
Run Code Online (Sandbox Code Playgroud)

为什么这个索引没有“覆盖”这个查询:

SELECT 
    GroupByColumn
    ,COUNT(*)
FROM MyTab
WHERE WhereColumn IS NULL
GROUP BY GroupByColumn
Run Code Online (Sandbox Code Playgroud)

我得到这个执行计划:

在此处输入图片说明

KeyLookup 用于 WhereColumn IS NULL 谓词。

这是计划:https : //www.brentozar.com/pastetheplan/?id=SJcbLHxO7

performance sql-server index-tuning filtered-index query-performance

23
推荐指数
2
解决办法
4299
查看次数

对于大字符串,“+”比“CONCAT”慢吗?

我一直认为CONCAT函数实际上是+(字符串连接)的包装,并带有一些额外的检查,以使我们的生活更轻松。

我还没有找到任何关于这些功能是如何实现的内部细节。至于性能,当数据在循环中连接时,调用似乎会产生开销CONCAT(这似乎很正常,因为有额外的 NULL 句柄)。

几天前,一位开发人员修改了一些字符串连接代码(从+到 ,CONCAT)因为不喜欢语法并告诉我它变得更快。

为了检查情况,我使用了以下代码:

DECLARE @V1 NVARCHAR(MAX)
       ,@V2 NVARCHAR(MAX)
       ,@V3 NVARCHAR(MAX);

DECLARE @R NVARCHAR(MAX);

SELECT  @V1 = REPLICATE(CAST('V1' AS NVARCHAR(MAX)), 50000000)
       ,@V2 = REPLICATE(CAST('V2' AS NVARCHAR(MAX)), 50000000)
       ,@V3 = REPLICATE(CAST('V3' AS NVARCHAR(MAX)), 50000000);
Run Code Online (Sandbox Code Playgroud)

这是变体一:

SELECT @R = CAST('' AS NVARCHAR(MAX)) + '{some small text}' + ISNULL(@V1, '{}') + ISNULL(@V2, '{}') + ISNULL(@V3, '{}'); 
SELECT LEN(@R); -- 1200000017
Run Code Online (Sandbox Code Playgroud)

这是变体二:

SELECT @R = CONCAT('{some small text}',ISNULL(@V1, '{}'), ISNULL(@V2, …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql concat standard-edition sql-server-2022

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

我是否需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

我已经有点知道这个问题的答案了,但我总觉得我需要更多地了解这个话题。

我的基本理解是,一般来说,仅包含您可能在任何给定时间查询/排序的所有字段的单个索引不太可能有用,但我已经看到了这种类型的事情。就像有人想的那样,“好吧,如果我们把所有这些东西都放在一个索引中,数据库就可以使用它来找到它需要的东西”,而从未见过一些正在运行的实际查询的执行计划。

想象一个像这样的表:

id int pk/uid
name varchar(50)
customerId int (foreign key)
dateCreated datetime
Run Code Online (Sandbox Code Playgroud)

我可能会看到一个包含name,customerIddateCreated字段的索引。

但我的理解是这样的索引不会在查询中使用,例如:

SELECT [id], [name], [customerId], [dateCreated]
   FROM Representatives WHERE customerId=1 
   ORDER BY dateCreated
Run Code Online (Sandbox Code Playgroud)

对于这样的查询,在我看来,更好的主意是包含customerIddateCreated字段的索引,该customerId字段是“第一”。这将创建一个索引,该索引将以这样一种方式组织数据,以便该查询可以快速找到它需要的内容 - 按照它需要的顺序。

我看到的另一件事,也许和第一件事一样频繁,是每个字段的单独索引;所以,每一个上namecustomerIddateCreated领域。

与第一个例子不同,这种安排在我看来有时至少是部分有用的。查询的执行计划可能会显示至少它使用 上的索引customerId来选择记录,但它没有使用带有dateCreated字段的索引对它们进行排序。


我知道这是一个广泛的问题,因为对任何特定表集的任何特定查询的具体答案通常是查看执行计划所说的它将要做什么,否则将表和查询的细节纳入帐户。另外,我知道这取决于查询的运行频率,而不是为其维护特定索引的开销。

但我想我要问的是作为索引的一般“起点”,为特定的、经常提取的查询和 WHERE 或 ORDER BY 子句中的字段设置特定索引的想法有意义吗?

index sql-server

22
推荐指数
2
解决办法
2571
查看次数

无重复组合的 SQL 查询

我需要一个可以在(或作为)函数中使用并检索 n 值的所有组合的查询。我需要长度 k 的所有组合,其中 k = 1..n。

扩展样本输入和结果,因此输入有 3 个值而不是 2 - 但是,输入值的数量可能从 1 到 n 不等。

示例:输入:在多行中的一列中包含值的表

Value  (nvarchar(500))
------
Ann
John
Mark
Run Code Online (Sandbox Code Playgroud)

输出#1:在一列中连接值的表

    Ann
    John
    Mark
    Ann,John
    John,Mark
    Ann,Mark
    Ann,John,Mark
Run Code Online (Sandbox Code Playgroud)

performance sql-server query-performance

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

检查更改索引重组/重建的进度

提交更改索引重组/重建时如何检查进度/状态?

sql-server dmv sql-server-2012

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