我想查询最近邻的空间数据。我正在使用这篇文章,以下查询完美运行:
SELECT TOP 1 [Location].STDistance(@Location)
FROM [DS1]
WHERE [Location].STDistance(@Location) IS NOT NULL
ORDER BY [Location].STDistance(@Location);
Run Code Online (Sandbox Code Playgroud)
问题是我需要为每个MSPID. 我尝试了几件事(使用交叉应用,创建单独的函数等)但没有任何效果。所以,我决定创建一个循环来计算每个MSPID.
SELECT TOP 1 [Location].STDistance(@Location)
FROM [DS1]
WHERE [Location].STDistance(@Location) IS NOT NULL
AND @CurrentMSPID = [MSPID]
ORDER BY [Location].STDistance(@Location);
Run Code Online (Sandbox Code Playgroud)
问题是上面的语句没有使用索引。如果我@CurrentMSPID用一个数字替换使用索引,但是当使用一个变量时,使用聚集索引而不是空间索引。
我尝试了很多选择,唯一有效的是:
OPTION (OPTIMIZE FOR ( @CurrentMSPID = 1001 ))
Run Code Online (Sandbox Code Playgroud)
或者当值是硬编码时。我不能那样做,因为将来这id甚至可能不存在,并且肯定会更改它匹配的行数。
该[DS1]表在[MSPID]列上有主键,在列上有空间索引[Location]。
如何在不使用OPTIMIZE FOR选项的情况下帮助引擎生成更好的执行计划并使用空间索引?
当从表中提取其他数据时(我们MSPID现在正在过滤),引擎似乎无法使用空间索引并执行聚集索引查找。
sql-server sql-server-2012 spatial sql-server-2014 nearest-neighbor
我试图避免我的MERGE查询出现死锁,它可能被不同的线程调用,并且可能在执行过程中使用相同的参数重叠。我对这个查询的体验与这个问题中描述的场景非常相似,我在下面列出了查询以供参考。
CREATE PROCEDURE MergeIt
@dataToMerge MyTableType READONLY
AS
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET XACT_ABORT ON;
BEGIN TRANSACTION
MERGE INTO TargetTable WITH(HOLDLOCK) AS [target]
USING @dataToMerge AS [source]
ON [source].KeyPart_1 = [target].KeyPart_1 AND
[source].KeyPart_2 = [target].KeyPart_2
WHEN NOT MATCHED THEN
INSERT(Data, KeyPart_1, KeyPart_2)
VALUES([source].Data, [source].KeyPart_1, [source].KeyPart_2)
WHEN MATCHED THEN
UPDATE SET [target].Data = [source].Data,
[target].KeyPart_1 = [source].KeyPart_1,
[target].KeyPart_2 = [source].KeyPart_2;
COMMIT TRANSACTION
RETURN 0
Run Code Online (Sandbox Code Playgroud)
TargetTable具有作为主键的标识列,并且对[KeyPart_1, KeyPart_2]列元组具有唯一性约束。 MyTableType具有类似于列元组的架构,TargetTable并且还定义了一个主键[KeyPart_1, KeyPart_2]。 …
我的桌子看起来像这样:
GroupID INT NOT NULL
SomeValue INT NOT NULL
Run Code Online (Sandbox Code Playgroud)
我想GroupID在结果集中保持相同的行。不过,这些组本身应该是随机排序的。SomeValue应该是次要排序标准。像这样:
GroupID, SomeValue
13, 1
13, 2
7, 1
7, 2
11, 1
11, 2
...
Run Code Online (Sandbox Code Playgroud)
ORDER BY GroupID, SomeValue不会随机排序组。ORDERBY NEWID()是完全随机的。ORDER BY SomeHash(GroupID), SomeValue浮现在脑海中,但我每次都需要一个新的随机顺序。
如何才能做到这一点?
我已经在 INSTANCE1 和 INSTANCE2 中配置了数据库邮件。每当我尝试使用以下代码发送邮件时,我都会在 INSTANCE1 中得到“邮件排队”的输出。
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Vinesh',
@recipients = 'VineshSenthilvel@gmail.com',
@body = 'The stored procedure finished successfully.',
@subject = 'Automated Success Message - Default' ;
Run Code Online (Sandbox Code Playgroud)
但是邮件没有发送到我的邮箱。我尝试在 INSTANCE2 中执行上述查询,邮件已送达。我已经验证数据库邮件配置在这两个实例中似乎都是完美的。
我可以在数据库邮件日志中找到数据库邮件进程正在关闭。还发现了下面提到的错误。
1) Exception Information
===================
Exception Type: Microsoft.SqlServer.Management.SqlIMail.Server.Common.BaseException
Message: The Transaction not longer valid.
Data: System.Collections.ListDictionaryInternal
TargetSite: Void ValidateConnectionAndTransaction()
HelpLink: NULL
Source: DatabaseMailEngine
StackTrace Information
===================
at Microsoft.SqlServer.Management.SqlIMail.Server.DataAccess.ConnectionManager.ValidateConnectionAndTransaction()
at Microsoft.SqlServer.Management.SqlIMail.Server.DataAccess.ConnectionManager.RollbackTransaction()
at Microsoft.SqlServer.Management.SqlIMail.IMailProcess.QueueItemProcesser.GetDataFromQueue(DataAccessAdapter da, Int32 lifetimeMinimumSec)
at Microsoft.SqlServer.Management.SqlIMail.IMailProcess.QueueItemProcesser.ProcessQueueItems(String dbName, String dbServerName, Int32 lifetimeMinimumSec, LogLevel loggingLevel, Byte[] encryptionKey, Int32 …Run Code Online (Sandbox Code Playgroud) 我在 Windows Server 2012 R2 上运行 SQL Server 2014。
共有三个节点,一个是远程DataCenter。所以两个节点有投票权。故障转移群集正在远程服务器上使用文件共享见证。
如果主服务器关闭,AG 自动故障转移工作,但当 SQL Server 关闭时,AG 自动故障转移不起作用。AG 等待Resolving状态。
还:
表决;
服务器分配的投票 当前投票 节点 1 1 1 节点 2 1 1 节点 3 0 0
我为所有网络禁用了防火墙,没有任何变化,问题持续存在。
有人可以帮我解决问题吗?
关键错误
此可用性副本的作用不正常。
副本没有主要或次要角色。
故障转移是从 node1 到 node2。两者都设置为同步和自动故障转移。节点未处于暂停状态。我已将所有节点安装为独立实例。
sql-server failover availability-groups windows-server sql-server-2014
我有一个问题,其中RowCountsaSP:StmtCompleted中的列返回的计数与为执行 select 语句而返回的实际行不同。
我select @@RowCount在 select 查询之后尝试了 a ,它返回的计数与count(*). 我现在很好奇是什么导致分析器返回不正确的行数。
我确实阅读了相关线程,表明碎片化可能会产生错误的计数并且DBCC UPDATEUSAGE可能会解决问题,但我想在应用它之前了解我在做什么。我将不胜感激。另外,索引是否在计数中起作用?
相关问答:SQL Server Row Count sp_spaceused rows 差异
我正在使用 SQL Server 2014 Profiler。
这是您在 Profiler 中查看行计数的方式,以防万一有人想知道:在 SQL Profiler 中显示行计数
我曾经在一家拥有第三方数据仓库解决方案的公司工作。显然所有的对象和表都隐藏在支持数据库中,所以我不清楚某些存储过程中究竟发生了什么。我在那里看到了这个有趣的存储过程,并想在我自己的解决方案中复制它,但我无法理解它是如何工作的。我正在描述下面的存储过程,如果有人能给我一些关于如何实现这一点的想法,这将非常有帮助。如果你能建议我如何使这更好,那就更好了。
存储过程被称为进程日志。它有 DBID、ObjectId、Step、Status、Remarks、Reads、Inserts、Updates、Delete 等参数
我们要做的是,在每个存储过程中,我们必须执行这个存储过程,状态为 2(进行中)在增加值后,在每个步骤或部分结束时可以多次执行这个存储过程的过程的可变步长。根据插入更新选择和删除语句的行数,我们应该在各自的存储过程参数变量中记录值。最后,您可以执行状态为 3(已完成)的相同存储过程,或者如果该过程在 catch 块中结束,状态将为 4(失败)在备注部分,我们可以复制 SQL 的错误消息。
为了查看所有这些信息,我们获得了一份报告的访问权限,显然我没有源代码,但报告显示了存储过程完成的时间,状态是多少插入更新删除和读取它做过。如果失败,错误信息是什么?
我已经有一些改进存储的想法,谁开始的?,参数的值是多少?对于谁开始存储过程部分,我有一个困惑。大多数这些存储过程作为不同作业的一部分运行。我们所有的作业都以服务帐户用户身份运行,但作业由不同的用户手动启动。我需要找出哪个用户启动了它,作为内部存储过程,作为当前用户,它将始终显示服务帐户。同样对于参数值,是否有更好的动态方法来找出这一点?而不是手动设置变量的值。我想使用 INPUTBUFFER 的输出,但它只显示参数的名称而不是值。
如果有人可以指导我有关此审计 SP 的后端表结构和脚本,那将非常有帮助。也欢迎任何更多的改进想法。
我的主要困惑:我相信他们有一些存储这些存储过程值的表,如果 SP 已经在运行,他们会在记录中进行更新,然后进行插入,但是他们如何识别在场景中进行插入而不是更新其中存储过程严重失败并且未执行 catch 块。
audit stored-procedures architecture sql-server-2014 logging
问题陈述: 我们的支持工程师需要从客户那里获取数据库备份。目前,我们的数据库包含在一个 Primary/.mdf 文件组/文件中。这些数据库多年来一直在收集历史数据,并且越来越大。我们的工程师需要几天时间才能将备份复制到我们的办公室。
似乎没有任何规定/想法来管理数据库的增长。
最“有价值”的数据是我们系统的“配置”。它包含在大约 50 个表中,我们正在考虑将这些表移至与历史数据(将放置在数据文件组中)分开的新配置文件组,以尝试为部分或文件备份设置阶段。
但我不确定我需要哪种备份/恢复策略来完成这个 - 部分备份或文件备份?
出于研发目的,我有一个名为FilegroupDemo使用SIMPLE恢复模型的数据库。FilegroupDemo包含 3 个文件组:
配置文件组中的数据不会经常更改,并且可能会被标记为只读(如果有帮助),而数据文件组中的数据每分钟更改一次。
我希望能够灵活地仅备份/恢复主文件组和配置文件组/文件。
在SQL Server Partial Backups的 BOL 文章中,它指出:
部分备份类似于完整数据库备份,但部分备份不包含所有文件组。相反,对于读写数据库,部分备份包含主文件组、每个读写文件组以及一个或多个只读文件(可选)中的数据。
这种读取方式让我认为部分备份旨在省略只读文件组,最有可能用于不会更改并标记为只读的大量数据。这些不需要每次都备份。
1. 我说存在部分备份是为了备份所有文件组(除了标记为只读的文件组)是否正确?换句话说,如果我不使用只读文件组,那么使用部分备份就没有意义了——对吗?而且我认为我不能使用部分备份来备份只读文件组?
因此,我不认为部分备份是我所需要的。我相当天真地尝试了文件备份/恢复。我将数据库切换到FULL恢复模式并运行:
BACKUP DATABASE FilegroupDemo FILEGROUP = N'PRIMARY'
TO DISK = N'C:\Backups\FilegroupDemo_FG_Primary.bak'
WITH INIT
GO
BACKUP DATABASE FilegroupDemo FILEGROUP = N'Configuration'
TO DISK = N'C:\Backups\FilegroupDemo_FG_Configuration.bak'
WITH INIT
GO
BACKUP DATABASE FilegroupDemo FILEGROUP …Run Code Online (Sandbox Code Playgroud) 我正在处理后端使用 SQL Server Express (2014) 的 Windows 应用程序的性能问题。
我主要是通过查看索引 SQL Server 端来设法使这个运行得更好,但是有一个特定的报告仍然运行得很慢。
查看它在做什么,它似乎在应用程序中循环并SELECT *针对一张表查询出数千个非常简单的查询WHERE = Primary Key,因此在每种情况下只检索一条记录。当我说 IDENTICAL 时,我的意思是相同的,它甚至没有改变主键来获取不同的东西,它显然每次需要时都从数据库中请求完全相同的记录,仅在几次中最多一百次秒。
这是一个示例报告,当服务器安静时,它需要大约 10-15 秒才能运行 - 查询运行了多少次我已添加为注释:
SELECT * FROM "Patient" WHERE "_Recno" = 35051 -- (runs 106 times)
SELECT * FROM "Client" WHERE "_Recno" = 15607 -- (99 times)
SELECT * FROM "SpeciesEntry" WHERE "_Recno" = 180 -- (97)
SELECT * FROM "Table" WHERE "_Recno" = 9 -- (97)
SELECT * FROM "DefaultEntry" WHERE "_Recno" = 2615 -- …Run Code Online (Sandbox Code Playgroud) 我想在一些非常大的宽表上实现(SQL Server 2014)聚集列存储索引。我需要更多内存来支持这个吗?如果是这样,我如何确定多少?
sql-server-2014 ×10
sql-server ×8
architecture ×1
audit ×1
backup ×1
columnstore ×1
deadlock ×1
etl ×1
failover ×1
index ×1
logging ×1
merge ×1
profiler ×1
restore ×1
spatial ×1