我有一个视图,它可以快速运行(几秒钟)最多 41 条记录(例如TOP 41
),但需要几分钟才能运行 44 条或更多条记录,如果使用TOP 42
或运行会产生中间结果TOP 43
。具体来说,它将在几秒钟内返回前 39 条记录,然后在返回剩余记录之前暂停近三分钟。这个模式在查询TOP 44
or时是一样的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) 我正在与具有多个数据库的客户合作。有几个master
级别数据库与instance
级别数据库(特定于应用程序的 DB)有关系。从instance
to的关系master
是整数值,表示master
. 中的视图和存储过程instances
设置为master
通过这些存储的键加载数据。
显然,没有真正的参照完整性,但这是不好的做法还是数据应该驻留在instance
数据库的只读表中?
sql-server best-practices referential-integrity multi-tenant
我有 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)
移动列被添加到表的末尾。
有没有办法在不删除表并将数据移动到新表的情况下实现这一目标?
我需要计算连续值的序列号。这听起来像是一份工作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
当我在我的第一个 SSAS 项目中处理多维数据集时,我一直得到这个错误的变化:
OLAP存储引擎错误:处理时找不到属性键:表:'dbo_Transactions',列:'TransactionSK',值:'68342998';表:'dbo_Transactions',列:'TransactionDateTimeUTC',值:'7625037'。属性是“事务SK”。
短语“处理时无法找到属性键”在 Google 上获得了多次点击,在 Stack Overflow 上也获得了多次点击(1、2、3)。然而,这些解决了损坏的 FK、NULL 值或重复值(例如,由于不一致的区分大小写)。这些情况都不适用。
这里只有一张桌子:dbo.Transactions
。它有田TransactionSK
和TransactionDateTimeUTC
,两者INT NOT NULL
。您可以猜到,该TransactionDateTimeUTC
字段是DateTimes
表的 FK ,但没有丢失记录,这是在 ETL 中强制执行的,我已经在 SQL 中进行了验证。
还有什么可能导致此错误消息?为什么它列出两个字段,TransactionSK
和TransactionDateTimeUTC
?到目前为止,我遇到的类似情况始终只引用错误消息中的一个字段。
该表正在近实时更新,包括偶尔删除,但有问题的两个字段没有更新。如果在 SSAS 扫描一列之后和扫描另一列之前从表中删除一条记录,是否会产生此错误?抽查了一些问题记录,它们不是在处理多维数据集的过程中创建的。
这是非常微不足道的,但如果有人手头有答案,我会很感激。
我使用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 代理作业。根据文档页面,我可以通过在 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 中,系统管理员角色是唯一的解决方案吗?
我正在开始一个加密项目EncryptByPassPhrase()
,主要使用VARCHAR
值。自然地,加密值比原始值长。是否有一个公式可以用来计算创建新VARBINARY
字段需要多长时间,以便保留原始VARCHAR
字段的任何可能值?
例如,我检查的第一个字段的长度值最多为 37 个字符,加密值最多为 100 个字节;另一个值最多 50 个字符,加密值最多 124 个字节。但是,短至两个或三个字符的值可以加密到 76 个字节。如果我将新字段的大小设置为 75 + X 字节,我是否有空间存储长度为 X 或更短的任何可能文本值的加密版本?
我最近为 RDS 数据库调整了数据和日志文件的大小,只留下了几 GB 的未分配空间。此后不久,分配了一些内容,然后又释放了 1 GB 的误差幅度。这可能是什么原因造成的?
所有数据库 - 包括 tempdb - 要么很小(MB),要么正好是它们设置的大小;它们加起来为 197 GB,在 200 GB 实例上留下 3 GB 可用空间。但是:
显然,如果这种情况再次发生,幅度稍大,就会出现问题。现在,我可以简单地缩小一个数据库文件以提供更大的余量,但我想了解实际发生了什么。
如何在单个语句中获得具有不同条件的DISTINCT
行,如果计数为零,则结果为零?COUNT
SELECT
我尝试了以下查询:
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 ×5
alter-table ×1
amazon-rds ×1
count ×1
disk-space ×1
distinct ×1
encryption ×1
multi-tenant ×1
permissions ×1
ssas ×1
t-sql ×1