标签: sql-server-2012

服务代理内部 spid 占用 tempdb

我们最近在多次接近中断后停用了一个实施得相当糟糕的服务代理设置,但是在我早上检查时,我注意到有 2 个服务代理内部 SPID (<50) 仍然持有约 75% 的 TempDB空间。

现在,我知道这些是服务代理任务,因为 SysProcesses 上的 CMD 列显示“BRKR EVENT HNDLR”和“BRKR TASK”,而最后的等待类型分别是“BROKER_EVENTHANDLER”和“SLEEP_TASK”。两者都将“背景”作为状态,0 开放交易和一个多月前的最后一批时间。

目前服务代理实现已完全禁用(从代码角度),队列已禁用(is_activation_enabled 和 is_receive_enabled = 0),transmission_queue、conversation_endpoints 或实际队列中没有任何内容,但有问题的数据库仍然有 is_broker_enabled = 1(与 TempDB 和 MSDB 一样)。

服务器当前正在运行带有安全修复程序 (11.0.5343.0) 的 SP2,即使在集群故障转移之后,TempDB 的使用似乎仍然存在。我们没有尝试重新启动,因为这是一个生产系统,但我认为故障转移会产生相同的效果。

以前有没有人遇到过这个问题,如果有,你是怎么解决的?

谢谢,

sql-server database-internals service-broker sql-server-2012 tempdb

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

SQL 未使用的登录名

有没有办法找出过去 90 天内未登录 SQL Server 或访问数据库的登录名?

sql-server maintenance sql-server-2012

5
推荐指数
2
解决办法
1781
查看次数

在 SQL Server Management Studio 中读取 CSV 并执行 SQL

是否可以在 SQL Server Management Studio 中读取 CSV 并每行执行 SQL 更新?

例子

数据.csv

"column1","column2,"column3" "column1","column2,"column3" "column1","column2,"column3" "column1","column2,"column3" "column1","column2,"column3"

我想根据每行中的数据运行 SQL 更新,例如

UPDATE [data].[orders] set order_number = $column1, something_else = $column2 where order = $column3

这可以在 SQL Server Management Studio 中完成吗?

sql-server-2012 csv

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

改变表开关

我有两列要从计算转换为非计算。我有代码。但是,有人建议我使用 ALTER TABLE SWITCH。我相信建议它的人不想让数据库停机。我想他们想要这样的东西 1)创建新文件组 2)创建新的重复表,它在新文件组上有计算列 3)将计算列更改为非计算列 4)切换数据库以使用这个新文件组/表 5) 删除带有计算列的旧文件组/表

但是,当我研究 ALTER TABLE SWITCH 命令时,在我看来,这种情况不是它的正确用法。

有没有办法使用 ALTER TABLE SWITCH 将计算列更改为非计算列?

sql-server-2012

5
推荐指数
2
解决办法
5145
查看次数

在同一个可用性组中拥有多个数据库与每个数据库具有单个 AG 相比有什么好处

我们正在计划从当前的镜像架构迁移到多个数据库的可用性组。对于每个数据库,我们都定义了主要/次要副本配置。

我不确定的问题是:我们是否需要将具有相同主要/次要配置的数据库分组到同一个 AG 中,还是每个数据库使用一个 AG。拥有多个数据库的单个 AG 与 AG 的优缺点是什么?是否有最佳实践来确定数据库是否需要自己的 AG 或可以与其他数据库结合使用?任何性能或故障转移优势?

sql-server-2012 availability-groups

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

SQL Server 2012 内连接估计行数问题

我有一个简单的连接,如下所示:

select * 
from fact_sales f
join dim_company d on f.company_SK = d.company_SK
Run Code Online (Sandbox Code Playgroud)

事实表包含略多于 5 亿条记录(带有 NC 列存储),查询将返回所有记录,但是,联接后的估计行数仅为 3 亿条。直到哈希连接,估计的行数是正确的,只有在连接之后才下降到 3 亿。这是查询的估计计划:

在此处输入图片说明

我已经更新了事实表(使用全扫描)和维度表中联接中使用的 SK 列的统计数据,这是每个表的直方图:

在此处输入图片说明

这个问题似乎只发生在数据库中的几个维度表上,加入其他维度表不会产生相同类型的基数估计问题 - 关于如何解决这个问题或进一步调查的任何建议?

如果我在查询中添加一个 where 子句,它会正确估计连接之前/之后的行数,例如

select * 
from fact_sales f
join dim_company d on f.company_SK = d.company_SK where company_SK = 1
Run Code Online (Sandbox Code Playgroud)

将估计来自连接的 467,583,000 行,这与直方图中的内容相匹配。

该问题似乎仅在查询中没有任何过滤器时才会发生。它在更大的查询中导致问题(排序溢出)。我已经将范围缩小到这个特定的连接。

我确实有一个 FK 约束,但它们WITH NOCHECK在事实表上已被关闭 ( )(我们被告知关闭它们以便 ETL 可以更快)。不幸的是,重新打开 FK 不是一种选择:(

更新:启用跟踪标志 2301 解决了这个问题:p

sql-server execution-plan sql-server-2012 cardinality-estimates

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

在视图和存储过程中查找和替换数据库名称

我有点窘迫。少数几个数据库中有 1,000 多个视图和存储过程,这些数据库被硬编码以追踪另一个数据库。

在我的示例中,SQL Server 中的数据库名称是HOST_1LOYALTY_1。意见和程序正试图在和声明之后HOST_PRODLOYALTY_PROD中。有什么办法,我可以做一个全局查找和各方面的意见和程序,以替换替换用?FROMJOINPROD1

必须有一种比右键单击每个脚本、在新窗口中创建更改脚本、更改文本并按 F5 更简单的方法。即使我可以创建所有必要的更改并立即运行它们,那也行。

stored-procedures view sql-server-2012

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

缓存聚合计数的性能注意事项

我们有一个InventoryActivity表,用于保存项目数量的交易变化:

CREATE TABLE dbo.InventoryActivity(
    InventoryActivity_uid int IDENTITY(1,1) NOT NULL PRIMARY KEY,
    Organization_uid int NOT NULL,
    MasterInventory_uid int NOT NULL,
    AdjustmentType_cd varchar(20) NULL,
    AdjustmentReason_cd varchar(20) NULL,
    Quantity int NULL
)
Run Code Online (Sandbox Code Playgroud)

我们想要一个InventorySummary应该聚合到每个的当前数量。汇总计数应该始终可以从交易记录的总和中推导出来,但是我们有几种不同的方法来计算汇总计数:

  1. 存储过程
  2. 单独的汇总表
  3. 索引视图

哪些性能考虑因素应该使天平有利于特定策略?
存在哪些最佳实践? *(我知道最佳实践接近于讨论,但我想知道哪些考虑会有助于做出决定)

这是一些示例代码和数据的小提琴

  1. 存储过程

    最简单的选择是每次都执行新鲜的 SUM 操作。但不涉及缓存,随着时间的推移可能会导致性能问题。

    CREATE PROCEDURE dbo.GetInventorySummary 
    AS   
    SELECT Organization_uid,
           MasterInventory_uid,
           SUM(Quantity) AS Quantity
    FROM dbo.InventoryActivity
    GROUP BY Organization_uid, MasterInventory_uid
    
    Run Code Online (Sandbox Code Playgroud)
  2. 单独的表

    我们可以创建一个表来存储当前数量。好的一面是获取这些数据是微不足道的。缺点是我们每次写入 InventoryActivity 表时都必须手动维护它并保持记录同步。

    CREATE TABLE dbo.InventorySummary(
        Organization_uid int NOT NULL,
        MasterInventory_uid int NOT NULL,
        Quantity int NOT NULL, …
    Run Code Online (Sandbox Code Playgroud)

sql-server aggregate cache sql-server-2012

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

OLE DB 错误 0x80004005 使用复制数据库向导

背景:在 Windows Server 2012R2 上新安装的 SQL Server 2012 SP3。

问题:当我使用复制数据库向导将数据库从server2复制到server2 时,我收到:

尝试在 SQL 上查找文件夹时遇到 OLE DB 错误,错误代码为 0x80004005(登录超时已过期)。

是的,我使用向导在同一台服务器上制作数据库副本。(会计软件和测试目的。)当向导尝试创建 Integration Services 包时,我收到此错误。同样重要的是,当我从我的计算机使用 SMSS 时会发生这种情况。我是这个 SQL Server的系统管理员。我什至将我的用户添加到此 Windows Server 的管理员组。

我们有一个旧的 server1,它的配置方式与 server2 非常相似。我检查了我想到的每个设置,两个配置看起来都一样。SSIS 包执行中没有代理,没有用户。

我可以从复制数据库服务器1服务器1服务器2Server1上没有任何问题。

看起来我没有足够的位置权限:server2_server2\DTS Packages\Copy Database Wizard Packages不管它是什么。

从理论上讲,我每次都可以使用 RDP 到服务器和域管理员帐户,但这在......后面很痛苦。还有会计软件支持,具有高 SQL 权限但不能具有域管理员。

我用谷歌搜索了这个,通常是关于 SQL Server 2008 和运行一些自定义包。

sql-server migration ssms ssis sql-server-2012

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

从聚集索引中找到每个项目最早日期的最佳方法是什么

我有一个 SQL Server 2012 表,其中包含这样的列:

ID int NOT NULL,
EventDate datetime NOT NULL,
... 32 other columns...
Run Code Online (Sandbox Code Playgroud)

其中该表在大约 10000 个不同的 ID 值范围内有大约 50 亿行。

该表有一个唯一的聚集索引,如下所示:

CREATE UNIQUE CLUSTERED INDEX [MyIndex] ON [dbo].[MyTable] (
    [ID] ASC,
    [EventDate] ASC
)
Run Code Online (Sandbox Code Playgroud)

我需要找到最早的每个 ID 的 EventDate,我可以使用以下查询获得它:

SELECT ID, min(EventDate) FROM [dbo].[MyTable] GROUP BY ID
Run Code Online (Sandbox Code Playgroud)

但是,此查询只需不到 2 分钟即可完成。

由于 NDA 限制,我无法分享我正在查看的问题的细节(查询计划等),但我可以建议我看到的是聚集索引扫描,因此它正在检查表中的所有行。鉴于数据是按 EventDate 序列组织的,我希望检索速度会快得多,但我不太确定如何。任何其他特定于 ID 的范围查询都会在几毫秒内响应,并且该表最近已重建并重新编制索引,因此我认为没有任何统计更新会有所帮助。

任何人都可以建议一种更好的方法来确定避免扫描整个聚集索引的最小 per-ID EventDate 值吗?

我确实有一个包含(10,000)个不同id值的表格。

performance sql-server sql-server-2012 greatest-n-per-group query-performance

5
推荐指数
2
解决办法
509
查看次数