小编Jon*_*des的帖子

返回固定行数后查询暂停

我有一个视图,它可以快速运行(几秒钟)最多 41 条记录(例如TOP 41),但需要几分钟才能运行 44 条或更多条记录,如果使用TOP 42或运行会产生中间结果TOP 43。具体来说,它将在几秒钟内返回前 39 条记录,然后在返回剩余记录之前暂停近三分钟。这个模式在查询TOP 44or时是一样的TOP 100

这个视图最初是从一个基本视图派生出来的,在基本视图中只添加了一个过滤器,下面代码中的最后一个。如果我从基础链接子视图,或者如果我使用内联基础中的代码编写子视图,似乎没有区别。基本视图在几秒钟内返回 100 条记录。我想我可以让子视图以与基础一样快的速度运行,而不是慢 50 倍。有没有人见过这种行为?关于原因或解决方案的任何猜测?

这种行为在过去几个小时内一直是一致的,因为我已经测试了所涉及的查询,尽管在事情开始变慢之前返回的行数略有上升和下降。这并不新鲜;我现在正在查看它,因为总运行时间是可以接受的(<2 分钟),但我已经在相关的日志文件中看到这种暂停至少几个月了。

阻塞

我从未见过查询被阻止,即使数据库上没有其他活动(由 sp_WhoIsActive 验证),问题仍然存在。基本视图包括NOLOCK整个内容,这是值得的。

查询

这是子视图的简化版本,为简单起见,基本视图内联。它仍然表现出运行时间的跳跃,大约有 40 条记录。

SELECT TOP 100 PERCENT
    Map.SalesforceAccountID AS Id,
    CAST(C.CustomerID AS NVARCHAR(255)) AS Name,
    CASE WHEN C.StreetAddress = 'Unknown' THEN '' ELSE C.StreetAddress                 END AS BillingStreet,
    CASE WHEN C.City          = 'Unknown' THEN '' ELSE SUBSTRING(C.City,        1, 40) END AS BillingCity,
                                                       SUBSTRING(C.Region,      1, 20) …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008

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

在单独的数据库之间建立关系是不好的做法吗?

我正在与具有多个数据库的客户合作。有几个master级别数据库与instance级别数据库(特定于应用程序的 DB)有关系。从instanceto的关系master是整数值,表示master. 中的视图和存储过程instances设置为master通过这些存储的键加载数据。

显然,没有真正的参照完整性,但这是不好的做法还是数据应该驻留在instance数据库的只读表中?

sql-server best-practices referential-integrity multi-tenant

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

添加一个新列并定义其在表格中的位置

我有 5 列的表 A:

TableA
--
Name
Tel
Email
Address
Run Code Online (Sandbox Code Playgroud)

我想在电话和电子邮件之间添加一个新列(移动):

TableA
--
Name
Tel
Mobile
Email
Address
Run Code Online (Sandbox Code Playgroud)

如果我使用

ALTER TABLE TableA
ADD COLUMN Mobile INT NOT NULL
Run Code Online (Sandbox Code Playgroud)

移动列被添加到表的末尾。

有没有办法在不删除表并将数据移动到新表的情况下实现这一目标?

sql-server-2008 database-design t-sql alter-table

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

我可以只计算连续记录的 ROW_NUMBER() 吗?

我需要计算连续值的序列号。这听起来像是一份工作ROW_NUMBER()

DECLARE @Data TABLE
    (
    Sequence    TINYINT NOT NULL PRIMARY KEY,
    Subset  CHAR(1) NOT NULL
    )
INSERT INTO @Data (Sequence, Subset) VALUES
    (1, 'A'),
    (2, 'A'),
    (3, 'A'),
    (4, 'B'),  -- New subset
    (5, 'B'),
    (6, 'A')   -- New subset

SELECT
    Sequence, Subset,
    ROW_NUMBER() OVER (PARTITION BY Subset ORDER BY Sequence) AS SeqWithinGroup
FROM
    @Data
Run Code Online (Sandbox Code Playgroud)

我希望该PARTITION子句在 中的每次更改时重置计数Subset,但 SQL Server 会收集给定Subset值的所有值并对它们进行编号。这是我所期望的,以及我得到的:

Sequence Subset Expected Actual
-------- ------ -------- -----
1        A      1        1 …
Run Code Online (Sandbox Code Playgroud)

sql-server window-functions gaps-and-islands sql-server-2017

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

什么原因导致“处理时找不到属性键”错误?

当我在我的第一个 SSAS 项目中处理多维数据集时,我一直得到这个错误的变化:

OLAP存储引擎错误:处理时找不到属性键:表:'dbo_Transactions',列:'TransactionSK',值:'68342998';表:'dbo_Transactions',列:'TransactionDateTimeUTC',值:'7625037'。属性是“事务SK”。

短语“处理时无法找到属性键”在 Google 上获得了多次点击,在 Stack Overflow 上也获得了多次点击(123)。然而,这些解决了损坏的 FK、NULL 值或重复值(例如,由于不一致的区分大小写)。这些情况都不适用。

这里只有一张桌子:dbo.Transactions。它有田TransactionSKTransactionDateTimeUTC,两者INT NOT NULL。您可以猜到,该TransactionDateTimeUTC字段是DateTimes表的 FK ,但没有丢失记录,这是在 ETL 中强制执行的,我已经在 SQL 中进行了验证。

还有什么可能导致此错误消息?为什么它列出两个字段,TransactionSKTransactionDateTimeUTC?到目前为止,我遇到的类似情况始终只引用错误消息中的一个字段。

该表正在近实时更新,包括偶尔删除,但有问题的两个字段没有更新。如果在 SSAS 扫描一列之后和扫描另一列之前从表中删除一条记录,是否会产生此错误?抽查了一些问题记录,它们不是在处理多维数据集的过程中创建的。

sql-server ssas sql-server-2014

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

有没有办法强制 sp_send_dbmail 使用 ANSI,或者不包含 Unicode 前缀?

这是非常微不足道的,但如果有人手头有答案,我会很感激。

我使用msdb..sp_send_dbmail存储过程作为分发简单报告的轻量级方法。这通常需要生成 CSV。但是,存储过程包括 Unicode little-endian 前缀 FF FE。这会混淆 Excel,导致它不会自动将 CSV 解析为列。

有许多变通方法:使用真正的报告平台(我们有 Crystal,但它从来没有可靠地工作过);将文件发送到一个小应用程序,该应用程序将文件转换为 ANSI 并继续发送;使用制表符分隔符(我最喜欢的);或教育收件人如何使用 CSV(开个玩笑,我们都知道这是不可能的)。

但是,我很想在某处拨动一个开关并告诉 SQL Server 停止将附件创建为 Unicode,因为我没有这样的需要。我还没有找到这样的设置;这可能吗?

谢谢!


编辑

根据 Rohan 的回答,SQL 代理作业步骤中的这个脚本几乎可以工作:

$reportQuery = "EXEC Routine..TopTenReviewsReport @DoNotLog = 1"
$filePath = "\\SQLBI001\RawData\TopTenReviewsReport.csv"
$mailQuery = "
  EXEC msdb..sp_send_dbmail
  @profile_name = 'X',
  @recipients = 'X',
  @subject = 'X',
  @file_attachments = '" + $filePath + "'"

Invoke-Sqlcmd -query $reportQuery | export-csv $filePath
$result = Invoke-Sqlcmd -query $mailQuery
Run Code Online (Sandbox Code Playgroud)

该文件现在有一个“#TYPE System.Data.DataRow”前缀,而不是 0xFF FE,但它现在是 ANSI,所以就是这样。

sql-server-2008 database-mail

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

我可以在不授予系统管理员权限的情况下委派 SQL 代理权限吗?

我想让用户能够管理 SQL 代理作业。根据文档页面,我可以通过在 msdb 上授予“适当的”角色来做到这一点。我已授予所有三个 SQLAgent% 角色,但用户在(作为测试)尝试重命名作业时收到此错误:

Only members of sysadmin role are allowed to update or delete jobs owned by a different login.
(Microsoft SQL Server, Error: 14525)
Run Code Online (Sandbox Code Playgroud)

这个问题是类似的,但没有解决 SQL 代理的答案。在 MS SQL 2K8 中,系统管理员角色是唯一的解决方案吗?

sql-server-2008 permissions sql-server-agent

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

EncryptByPassPhrase() 的输出相对于输入有多长?

我正在开始一个加密项目EncryptByPassPhrase(),主要使用VARCHAR值。自然地,加密值比原始值长。是否有一个公式可以用来计算创建新VARBINARY字段需要多长时间,以便保留原始VARCHAR字段的任何可能值?

例如,我检查的第一个字段的长度值最多为 37 个字符,加密值最多为 100 个字节;另一个值最多 50 个字符,加密值最多 124 个字节。但是,短至两个或三个字符的值可以加密到 76 个字节。如果我将新字段的大小设置为 75 + X 字节,我是否有空间存储长度为 X 或更短的任何可能文本值的加密版本?

sql-server encryption sql-server-2014

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

在 Amazon RDS 上,除了数据库文件之外,还有什么会消耗存储空间?

我最近为 RDS 数据库调整了数据和日志文件的大小,只留下了几 GB 的未分配空间。此后不久,分配了一些内容,然后又释放了 1 GB 的误差幅度。这可能是什么原因造成的?

所有数据库 - 包括 tempdb - 要么很小(MB),要么正好是它们设置的大小;它们加起来为 197 GB,在 200 GB 实例上留下 3 GB 可用空间。但是:

可用空间从 3 GB 降至 1.5 GB,然后返回

显然,如果这种情况再次发生,幅度稍大,就会出现问题。现在,我可以简单地缩小一个数据库文件以提供更大的余量,但我想了解实际发生了什么。

disk-space amazon-rds

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

如何在同一字段上使用不同的 where 子句获得不同的计数?

如何在单个语句中获得具有不同条件的DISTINCT行,如果计数为零,则结果为零?COUNTSELECT

我尝试了以下查询:

SELECT DISTINCT
    A.DeviceFilter,
    (SELECT count(*) FROM DeviceLicense AS B WHERE A.DeviceFilter = B.DeviceFilter AND b.OrganizationId = 1001) 
FROM
    DeviceLicense AS A
GROUP BY
    A.DeviceFilter
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

sql-server count distinct

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