标签: sql-server-2008

在 ETL 系统上将简单恢复模型更改为批量日志是个好主意吗?

我们有一个 ETL 过程,它将大量数据插入到表中。该数据库设置为简单恢复模型,并且事务日志增长很多。我在想将这个数据库设置为批量日志恢复模型会有帮助吗?我们每天都会进行完整备份。那么,与简单恢复模型相比,批量日志恢复模型中是否存在一些未记录的操作?

sql-server-2008 sql-server etl backup recovery

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

SQL Server 分区 - 父/子表

我目前正在研究为相当大(800GB 且不断增长)的 SQL Server 数据库实施分区。表中的所有数据都与日期/时间相关,但是该日期/时间通常在另一个表中引用。例如,我有:

*Instances*
Timestamp (partition key!)
LocationID
...

*Events*
InstanceID
...

*Location*
ID
...
Run Code Online (Sandbox Code Playgroud)

这里,实例包含分区键。这引用了一个位置(LocationID > Location.ID)。此外,还有引用实例的事件表(InstanceID > Instance.ID)。

有什么方法可以将分区应用于此结构,而不必对表进行非规范化并将“时间戳”列复制到各处?

我正在使用 SQL Server 2008 R2。提前致谢。

sql-server-2008 sql-server sql-server-2008-r2 partitioning

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

如何设置只读 odbc 连接?

我有一个用户需要对我管理的 SQL Server 2008 数据库进行查询。他们有权编辑数据,但我希望他们不能直接针对表格进行编辑(即,我希望他们使用为其提供的应用程序)。

我想做的是给他们一个只读 ODBC 连接,并在其上挂一个 MS Access MDB/ACCDB,让他们查询自己想要的内容,而不会意外地“更新”数据。

有没有办法做到这一点,或者我必须创建一个 RO 用户供他们使用,然后威胁他们,如果他们使用常规 RW 帐户连接,会带来很大的痛苦?在这种情况下,为什么不让他们在应用程序之外编辑数据时承受很大的痛苦呢?

sql-server-2008 windows odbc

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

维护大表的全文索引

我使用的是 SQL Server 2008,有一个用于报告目的的表,其中包含 500,000 条记录,这些记录很容易达到数百万条。该表将采用全文索引来快速搜索少数列。

由于这是报告表而不是源事务表,因此有时会添加新记录,而有时由于源表中发生的更改而必须删除现有记录。

我的问题是关于构建(正在进行的)报告表并维护该表的全文索引的最佳方法。

添加全文索引后,我应该:

  1. 保留索引,并根据需要删除/添加记录
  2. 保留索引,截断报告表,然后插入所有适当的记录
  3. 其他?

到目前为止,我在研究时已经看到了这些文章,但这种情况的最佳实践并不明显。

  1. https://learn.microsoft.com/en-us/sql/relational-databases/search/get-started-with-full-text-search?redirectedfrom=MSDN&view=sql-server-ver15
  2. https://techcommunity.microsoft.com/t5/datacat/best-practices-for-integrated-full-text-search-ifts-in-sql-2008/ba-p/305000
  3. https://social.msdn.microsoft.com/Forums/en-US/c743f6e4-88c6-478b-954b-ba8207e391c5/sql-2005-full-text-index-rebuild-nightly-best-approach?forum=sqldatabaseengine

sql-server-2008 best-practices full-text-search

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

将两个具有相同结构的数据库中的数据合并到一个数据库中

我在五个不同的地理位置有五个具有相同架构的 SQL Server 数据库。这些位置定期向中央服务器发送备份,我在五个各自的数据库中恢复这些备份。

现在的要求是,这五个数据库的数据必须合并到一个数据库中进行整合。

任何有关解决方案的建议都是非常受欢迎的。

sql-server-2008 sql-server

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

在消息窗格上打印执行时间?

如何在消息窗格上打印每个查询的执行时间?例如,Select * from tbl1运行 10 分钟,然后Select * from tbl2运行 ​​15 分钟,依此类推。

Select * from tbl1
Go
Select * from tbl2
Go
Select * from tbl3
Go
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server execution-plan

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

恢复数据库还是恢复文件?

我正在将数据库从实时环境复制到测试环境。我已经从实时数据库创建了一个 .bak 文件并将该文件复制到测试服务器。

问题是,我应该使用“恢复数据库”将其添加到测试服务器还是“恢复文件和文件组”?

(有时数据库已经存在,有时则不存在。在任何一种情况下,我只想拥有原始数据库的克隆,而不关心覆盖)

经过一番尝试后,它似乎都达到了我想要的效果 - 那么真正的区别是什么,我针对我的情况使用哪种方法重要吗?

sql-server-2008 sql-server

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

如何从基线计算所需资源以及应该衡量什么?

我必须处理以下情况:

目前我们有

  • 1 个集群,包含 5 个节点,运行 10 个实例(SQL Server 2008 企业版),以及
  • 1 个集群,2 个节点运行 5 个实例(SQL Server 2014 标准版)

正在使用。所有服务器都是在VMWare 中运行的虚拟服务器。

我们想要设置一个新的集群(SQL Server 2014 Enterprise)。第一步,将迁移 2008 Enterprise 集群中的 1 个实例和 2104 Standard 集群中的 1 个实例。

于是,老板问了我两个问题:

  1. 我们需要多少个核心(目标:最大限度地降低许可成本)?
  2. 我们需要多少内存?

我的回答是:“这取决于......”现在我必须通过监控接下来的几周来提供确凿的事实。伟大的!(小心讽刺)

我对第一个问题的处理方法:

我计划使用 perfmon.exe 进行监控

  • 处理器\% 处理器时间(_总核和单核),
  • 处理器\% 用户时间(_总核和单核),
  • 处理器\%中断时间(_总和单核)-这真的有必要吗?-, 和
  • 系统\处理器队列长度

问题是,这些数据从哪里获取呢?从节点?来自 SQL Server?

在第一种情况下,它应该很简单:第一个实例 -为了简单起见vsql2008ent-1\instanceX - 当前正在节点上运行,我们将其命名为节点sql2008NodeA。正常情况下,该节点上不应运行任何其他实例或服务器。所以我从哪里获取数据并不重要,不是吗?如果发生灾难,其他实例也将在此节点上运行。但我们希望有一个正常运行的基线。

第二个实例 - vsql2014stan-1\instanceY - 与其他 2 个实例共享其节点 - sql2014NodeA。在这种情况下,我永远无法确定实例真正需要多少核心才能平稳运行,对吧?这样我就可以监控实例了。但结果意味着什么呢?它仅显示该实例实际使用的CPU资源。但如果有可用的内核,是否会使用更多内核?那么上述问题的答案是什么呢?

内存是另一个问题。由于过去发生过几次灾难,当所有实例都落在同一节点上时,我为每个实例设置了最大服务器内存的上限。此限制取决于节点的可用内存(当前分别为 100GB 或 120GB)。那么如何监控呢?如果所有内存都用完,一切似乎都清楚了:内存不足。如果一切都变慢:内存不足。但我真正需要多少内存?

我尝试总结一下我的问题:

  1. 我应该从哪里获取测量值(节点与服务器)? …

sql-server-2008 monitoring sql-server sql-server-2014

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

将 .Net 程序集添加到 SQL CLR,而不打开 TRUSTWORTHY

我正在尝试使用 Solomon Rutzky 在其后程序集部署中提供的指导来添加“System.Messaging.dll”,并使用非对称密钥使用 UNSAFE 或 EXTERNAL_ACCESS 权限,但我在第一个障碍上失败了。

脚本的第一部分是从程序集创建证书;

CREATE CERTIFICATE [MS.NETcer] FROM EXECUTABLE FILE = 'C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Messaging.dll';
GO
Run Code Online (Sandbox Code Playgroud)

但是,当我执行此操作时,我收到错误;

Msg 15208, Level 16, State 1, Line 1
The certificate, asymmetric key, or private key file does not exist or has invalid format.
Run Code Online (Sandbox Code Playgroud)

我用来执行命令的帐户具有“sysadmin”服务器角色。这是在 SQL Server 2008 实例上。

请问有人对为什么失败有任何想法吗?

---------- 更新 1 -----------

我采纳了所罗门的建议并修改了我的脚本,使其看起来像这样;

CREATE ASYMMETRIC KEY [Key.System.Messaging] FROM EXECUTABLE FILE = 'C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Messaging.dll';
GO

CREATE LOGIN [CLR.Login.System.Messaging] FROM ASYMMETRIC KEY [Key.System.Messaging];
GO

GRANT UNSAFE ASSEMBLY TO [CLR.Login.System.Messaging];
GO
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都很好。我现在运行 …

sql-server-2008 sql-server best-practices sql-clr signature

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

将多行插入到只有 IDENTITY 列的表中

我有一个dbo.Groups定义如下的表:

CREATE TABLE dbo.Groups
(
  GroupID int NOT NULL IDENTITY (1,1) PRIMARY KEY
);
Run Code Online (Sandbox Code Playgroud)

该表实际上只包含一IDENTITY列。

有时我想一次插入多行并获取生成的 ID。(我已经有一个预定义的表变量,@output其中包含ID要在OUTPUT子句中使用的单个列。)

现在我知道如果它是单行我将如何进行:

INSERT INTO
  dbo.GroupID
OUTPUT
  inserted.GroupID INTO @output (ID)
DEFAULT VALUES
;
Run Code Online (Sandbox Code Playgroud)

但我希望能够一次性插入两个或更多。实际数量由此查询返回的行数决定:

SELECT
  *
FROM
  dbo.MySource
;
Run Code Online (Sandbox Code Playgroud)

因此,如果查询返回一行,我想插入一行dbo.Groups并返回生成的GroupID. 如果它是一百行,那么我希望插入一百行并同时生成和返回一百个 ID。

一种明显的方法是在循环中一次插入一行。我想避免这种情况,而是使用基于集合的方法,类似于

INSERT INTO
  dbo.GroupID
OUTPUT
  inserted.GroupID INTO @output (ID)
SELECT
  ...  -- what?
FROM
  dbo.MySource
;
Run Code Online (Sandbox Code Playgroud)

有没有办法IDENTITY在(最好)单个语句中只用一列将多行插入到表中?

sql-server-2008 sql-server insert identity

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