我根本不了解 Oracle,但我听过 Oracle DBA 说与使用 Oracle(作为 DBA)一起工作比使用 SQL Server“更难”、更困难、要求更高。这个说法有依据吗?
我的数据库中有一些不应缓存的表。
如何告诉 SQL Server 不要缓存表的页面或如何从缓存中刷新单个表?
刷新所有缓存不是一种选择。
我正在使用 SQL Server 2008 和 SQL Server 2008 R2。
有没有人成功镜像分发数据库?我们有一个专用服务器作为分销商。它处理我们从生产到报告的所有推送复制。我们想在附近建立一个相同的服务器,以防分销商崩溃。有没有人成功构建过这样的东西?
我有一个脚本组件,它接受来自 SQL Azure 数据库表的记录。然后该脚本调用一个 Web 服务,该服务返回失败和成功记录的数量。
对于所有记录,我想添加具有“成功”或“失败”的状态字段,这会从脚本组件获取输出。
然后我将这些输出记录到一个文本文件中。
问题:我无法为每个输入记录添加状态,因为 Web 服务调用仅在执行后发生。
我试过这个,但仍然不起作用:
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
listOfData.Add(new ClockData
{
TimeClockID=Row.TimeClockID,
PersonID=Row.EmployeeCode,
LocationCode=Row.ClockInServiceContextID,
ClockInDateTime=Row.ClockInDateTime,
ClockOutDateTime=Row.ClockOutDateTime
});
}
public override void CreateNewOutputRows()
{
MessageBox.Show("Test CreateNewOutputRows");
MessageBox.Show(listOfData.Count.ToString());
foreach (var item in listOfData)
{
Output0Buffer.AddRow();
Output0Buffer.EmployeeCode = item.PersonID;
MessageBox.Show(item.PersonID);
}
}
Run Code Online (Sandbox Code Playgroud) 为了诊断一些性能问题,我想更好地了解与系统性能相比调用某些过程的次数。有没有办法获得在特定时间跨度内每个过程被调用的次数?
在我正在处理的一个项目中,必须跟踪对数据库某些表中行的每次更改以进行进一步审计或回滚。必须很容易找到谁修改了行,从哪个 IP 地址和时间,并且能够恢复以前的版本。
例如 Stack Exchange 使用了类似的东西。当我改变别人的问题时,有可能发现我改变了它,并且回滚了改变。
考虑到我当前的架构与普通业务应用程序具有大致相同的属性(如下),用于将每个更改存储在数据库中的通用技术是什么?
nvarchar(1000)例如可能有一些,但不是大量的二进制数据,这个直接存储在磁盘上,直接访问,而不是通过 Microsoft SQL filestream,<tl-博士>
我想过以下案例,但我对这些场景没有真正的经验,所以我想听听其他人的意见:
将所有内容存储在同一个表中,按 ID 和版本区分行。IMO,这是非常愚蠢的,迟早会在性能水平上受到伤害。使用这种方法,也不可能为最新项目和版本跟踪设置不同的安全级别。最后,每个查询的编写都会更加复杂。实际上,要访问最新数据,我将被迫按 ID 对所有内容进行分组,并在每个组中检索最新版本。
将最新版本存储在一个表中,并在每次更改时将过时版本复制到另一个模式中的另一个表中。缺陷是每次我们都会存储每个值,即使它没有改变。设置不变值null不是一个解决方案,因为我还必须当值更改为跟踪null或null。
将最新版本存储在一个表中,并将更改的属性列表及其以前的值存储在另一个表中。这似乎有两个缺陷:最重要的一个是,对同一列中不同类型的先前值进行排序的唯一方法是使用binary(max). 第二个是,我相信,在向用户显示以前的版本时,使用这种结构会更加困难。
执行与前两点相同的操作,但将版本存储在单独的数据库中。在性能方面,为了避免通过将以前的版本放在同一数据库中而减慢对最新版本的访问速度可能会很有趣;尽管如此,我认为这是一个过早的优化,只有在有证据表明在同一数据库中拥有旧版本和最新版本是瓶颈时才必须进行优化。
</tl-dr>
¹ 例如,将更改存储到日志文件中是不可接受的,就像对 HTTP 日志所做的那样,并在服务器负载最低的晚上将数据从日志刷新到数据库中。有关不同版本的信息必须立即或几乎立即可用;几秒钟的延迟是可以接受的。
² 信息不是很频繁,只有特定的用户组才能访问,但是,强迫他们等待 30 秒才能显示版本列表是不可接受的。同样,几秒钟的延迟是可以接受的。
我们刚刚开始设计一个新的数据仓库,我们正在尝试设计日期和时间维度的工作方式。我们需要能够支持多个时区(可能至少是 GMT、IST、PST 和 EST)。我们最初认为我们将有一个广泛的组合日期时间维度,大约 15 分钟的粒度,这样我们的事实表中有一个键,所有支持的时区的所有不同日期时间数据都在一个维度表中。(即日期键、GMT 日期、GMT 时间、IST 日期、IST 时间等...)
Kimball 建议从一天的时间维度中设置一个单独的日期维度,以防止表变得过大(数据仓库工具包第 240 页),这听起来不错,但这意味着我们在每个时区的事实表中有两个键我们需要支持(一个用于日期,一个用于一天中的时间)。
由于我在这方面非常缺乏经验,我希望有人知道这两种方法之间的权衡,即性能与所有不同时区键的管理。也许还有其他方法,我看到有些人谈论在每个时区的事实表中有一个单独的行,但这似乎是一个问题,如果你的事实表有数百万行,那么你需要将它翻两番来添加时区.
如果我们使用 15 分钟的粒度,我们的日期时间维度表中每年将有 131,400 (24 * 15 * 365) 行,这对性能来说听起来并不太可怕,但在我们测试之前我们不会确定原型查询。在事实表中使用单独的时区键的另一个问题是查询必须根据所需的时区将维度表连接到不同的列,也许这是 SSAS 为您处理的事情,我不确定.
感谢您的任何想法,-马特
我们添加了一个服务器登录名和数据库用户,使用以下脚本将 Windows 组映射到 SQL 2008 R2 实例,并更改了匿名名称:
USE master
go
CREATE LOGIN [DOMAIN\AppUsers] FROM WINDOWS
WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]
go
USE AppDb
go
CREATE USER [DOMAIN\AppUsers] FOR LOGIN
[DOMAIN\AppUsers]
go
EXEC sp_addrolemember N'db_owner', N'DOMAIN\AppUsers'
go
Run Code Online (Sandbox Code Playgroud)
当 DOMAIN\User1 帐户登录到该应用程序时,User1 可以很好地查询 dbo 架构中的表,因为 User1 是 DOMAIN\AppUsers 的成员,但该应用程序也允许用户创建表。在未指定架构的情况下创建这些表时,SQL Server 执行以下操作:
我对这些结果完全感到困惑。以下是我的问题:
我们刚刚开始在一个为简单起见而首选 SQL 身份验证的组织内使用 Windows 身份验证,所以我确信我的问题来自对差异的无知。这段代码早在我们考虑使用 Windows 身份验证之前就编写好了,所以我确信我们需要提高我们对使用 Windows 身份验证登录时创建新架构的理解,而不是数据库所有者。
如果您不知道,我是推动使用 Windows 身份验证而不是 SQL 身份验证的人。如果我们对此没有充分理解,我们将回到 …
在Stackoverflow上问了这个问题后,我想知道我所做的是正确/最佳实践的地方。
基本上,我创建的每个对象都进入一个模式,模式名称反映了用法。例如,我有模式Audit和Admin(除其他外)。
这反过来在 中没有留下任何对象dbo。这个可以吗?还有什么我需要做的吗?
我读到,如果我使用 IsolationLevel.ReadUncommitted,则查询不应发出任何锁。但是,当我对此进行测试时,我看到了以下锁定:
Resource_Type:HOBT
Request_Mode:S(共享)
什么是 HOBT 锁?与 HBT(堆或二叉树锁)相关的东西?
为什么我还会得到 S 锁?
在不打开隔离级别快照选项的情况下进行查询时如何避免共享锁定?
我正在 SQLServer 2008 上对此进行测试,并且快照选项设置为关闭。查询仅执行选择。
我可以看到 Sch-S 是必需的,尽管 SQL Server 似乎没有在我的锁定查询中显示它。为什么它仍然发出共享锁?根据:
在该
READ UNCOMMITTED级别运行的事务不会发出共享锁,以防止其他事务修改当前事务读取的数据。
所以我有点困惑。
sql-server ×10
ssis ×2
locking ×1
mirroring ×1
monitoring ×1
optimization ×1
oracle ×1
performance ×1
schema ×1
ssas ×1
ssms ×1