我们有一个FILESTREAM包含几百万个文件的容器,我们相信这是我们遇到的性能问题(大量超时)的原因。
根据这个关于FILESTREAM最佳实践的博客,每个容器不应超过 300,000 个文件。
根据此处接受的答案,除非将表重新创建到新FILESTREAM位置,否则无法完成它。
表的结构如下:
CREATE TABLE [dbo].[Documents](
[ContentPath] [uniqueidentifier] ROWGUIDCOL NOT NULL,
[FileContent] [varbinary](max) FILESTREAM NULL,
CONSTRAINT [UQ_IX_Documents_ContentPath] UNIQUE NONCLUSTERED
(
[ContentPath] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY] FILESTREAM_ON [FSFileGroup_1]
Run Code Online (Sandbox Code Playgroud)
我们使用的是 SQL Server 2012。不幸的是,不是 Enterprise(我们最近才意识到它支持每个文件组多个容器)。
尽管我们从不进行记录更新,但我们进行了大量写入,可能与读取一样多。模式是:一次一个,由 ContentPath 读取,并且没有特定的容器或顺序写入。
我从第一台服务器(运行 SQL Server 2014)备份了一个数据库。
当我尝试将备份恢复到第二台服务器(运行 SQL Server 2012)时,我收到以下警告消息:
警告消息 - 将进行源数据库的尾日志备份。查看选项页面上的设置。
如果我忽略此消息并尝试恢复,则会失败。
任何的想法 ?我该怎么办 ?
我是数据库的新手,事实上,我是编程的新手。我想创建一个函数或者一个存储过程(如果它有效)来为用户表的一列插入/创建默认值。在这个表中,每个注册用户都应该被分配一个userId like K16060600,格式为Kyymmddxx,其中
K对于每个userId都是常数,yy代表年份(例如162016 年),mm 代表月份,dd 代表白天,xx 是一个 00 到 99 的数字,每当添加新行/用户时,它应该从 00 递增。我怎样才能做到这一点?
我使用的是 Visual Studio 2012 和 SQL Server 2012。
我们遇到了复制问题,其中在 3300 万行的表上进行了大型(750 万行)更新。复制将其转换为 750 万条单独的更新语句。当我的警报通知我我们的出版物低于我们的门槛时,我开始检查这个问题。
我发现更新已被执行,并且需要几天时间来仔细阅读这些更新语句。所以我决定看看我们是否可以跳过它试图处理的那些记录。使用系统表和存储过程,我能够确定执行更新的时间段。一旦找到最后一个xact_seqno,我就停止分发代理,并手动更新订阅者数据库。然后我执行sp_setsubscriptionxactseqno, 跳过所有这 750 万笔交易。当我启动分发代理时,它似乎工作正常并且能够处理剩余的事务。
为了更好地衡量,我使用 Redgate 的数据比较来查看数据是否混乱,但我丢失了大约 24 条记录(最初可能没有,因为我没有设置它)。
我的问题是这是修复它的正确方法吗?你怎么总是保证得到下一个Xact_seqno?您是按Xact_Seqnoentry_time 或 entry_time订购交易?
replication sql-server sql-server-2012 transactional-replication
对于 SQL Server 2012 及更高版本,如SQL Server 安装中的新增功能所述:
BUILTIN\administrators和本地系统( NT AUTHORITY\SYSTEM ) 不会在 sysadmin 固定服务器角色中自动配置。
就我而言,这已经成为一个问题:我有一个 WiX 安装程序,它使用Custom ActionC++ 代码来设置数据库数据(创建数据库、视图、过程、数据等)。Custom Action以 user 身份运行NT AUTHORITY\SYSTEM,但此帐户没有执行CREATE DATABASE脚本的权限。
安装软件时赋予sysadmin角色是否正确NT AUTHORITY\SYSTEM?或者也许有更好的解决方案?
如果正确,是否可以找到正确的用户名NT AUTHORITY\SYSTEM?我需要这个名字才能更改权限*。在不同的语言环境中,此名称是不同的,例如,NT AUTHORITY\SYSTEM或NT AUTHORITY\???????。
添加NT AUTHORITY\SYSTEM到sysadmin角色:
IF NOT EXISTS
(
SELECT name
FROM master.sys.server_principals
WHERE IS_SRVROLEMEMBER ('sysadmin', name) = 1
AND name LIKE 'NT AUTHORITY\SYSTEM'
)
EXEC …Run Code Online (Sandbox Code Playgroud) 我需要帮助来处理我的数据库中的权限问题。
这是场景:
1 数据库
4 架构:
在schemaD 中,我有一个名为viewABC的视图,它从在schemaA、schemaB e schemaC上分配的表和视图中获取信息。
用户用户X拥有SELECT权限viewABC。
使用以下命令我授予权限:
GRANT SELECT ON schemaD.viewABC TO userX;
Run Code Online (Sandbox Code Playgroud)
当userX尝试SELECT对视图执行 a时,可以这样:
SELECT * FROM schemaD.viewABC;
Run Code Online (Sandbox Code Playgroud)
我们得到错误:
对象“tableA”、数据库“MyDatabase”、架构“schemaA”的 SELECT 权限被拒绝。
我确实理解发生错误是因为tableA位于不同的架构上,具有不同的所有者(dbo 而不是 ownerX),并且 SQLServer 应用 userX权限来授予或拒绝访问权限。一旦userX 没有对 tableA的显式访问权限,查询执行就会返回错误。 …
我们为连接到其 SQLServer 数据库的客户编写了一个简单的“客户端”应用程序,对“属性”运行大约 360 次查询,并将该数据作为我们称为“cProp”的 .Net 对象返回。
查询的复杂性各不相同,但最长的可能需要 400 毫秒。当我们最近为 60 个属性运行它时,整个运行大约需要 3 分钟。客户决定将他们的数据库移动到我们之间 65 毫秒的远程服务器。结果,相同的查询需要 51 分钟。
现在我 99% 确定问题是行检索,但我需要证明这一点。DBA 对该过程进行了跟踪,但之前从未使用过它,我很沮丧地发现它包含的信息如此之少。我所看到的是,它花了不到 4 分钟的服务器时间。这加强了我的信念,即问题出在行检索上。
但我如何衡量呢?跟踪不返回关于行数或总数据大小的任何信息 - 我做错了吗?我也知道批处理发生在服务器之外,那么我们如何知道那里发生了什么?一般来说,可以这么说,如何调试“服务器外部”发生的问题。
我创建了两个对应于两个 Windows 组的 SQL Server 登录名:
MachineName\MyAppAmdin
MachineName\MyAppUser
Run Code Online (Sandbox Code Playgroud)
然后在数据库中,我创建了两个具有相同名称的用户并将它们映射到登录名。
在 Windows 服务器中,我将我的域帐户添加MyDomain\MyAccount到MachineName\MyAppAmdin组中。
现在我可以通过 Windows 身份验证通过MyDomain\MyAccount.
问题是,我想确切地知道我正在使用哪个 Windows 组登录,但我不知道如何。
我试过:
ORIGINAL_LOGIN()
SYSTEM_USER
SUSER_SNAME
SELECT * FROM dm_exec_sessions
Run Code Online (Sandbox Code Playgroud)
以上所有内容都会返回MyDomain\MyAccount,但我需要知道的是我是否通过MachineName\MyAppAmdin.
总结一下,我的问题是:
有没有办法准确判断当前连接使用的是哪个 Windows 组登录(或用户)?
或者有什么方法可以检查是否MyDomain\MyAccount与特定用户或登录名相关联?
我知道我可以使用 C# 或命令来解析域帐户是否属于特定的 Windows 组,但是我们有一些新的 IT 策略,所以我正在考虑使用 TSQL 实现类似结果的方法。
假设我们有一个Orders包含列的表order_id, total, discount
然后我们写一个类似于下面的查询
SELECT
COUNT(order_id) AS num_orders
, SUM(total) / COUNT(order_id) as avg_total
, SUM(discount) / COUNT(order_id) AS avg_discount
FROM Orders
Run Code Online (Sandbox Code Playgroud)
COUNT(order_id)Preserved的值是跨列还是重新计算(例如,是否有性能影响)?或者最好先确定计算值并在查询中使用这些值,例如:
DECLARE @order_count AS INT
SELECT
@order_count = COUNT(order_id)
FROM Orders
SELECT
@order_count AS num_orders
, SUM(total) / @order_count as avg_total
, SUM(discount) / @order_count AS avg_discount
FROM Orders
Run Code Online (Sandbox Code Playgroud)
请注意,在编写此问题时,我注意到由于AVG()支持SQL Server 2008 。但是,我继续了这个问题,并打算更一般地想了解 SQL Server 如何处理跨列的相同聚合,因为我有时会以其他形式遇到这个问题。
我看到 SQL Server 中的默认系统健康会话事件是 5 MB,每个事件总共有 4 个文件。
我们正在尝试从历史事件中的系统健康状况中获取数据,但对于一些关键的生产服务器,它们只会非常快速地滚动。对有些人来说,他们甚至在那里呆了几个星期
SQL Server 中滚动文件的机制是如何工作的,有没有一种方法可以检查这种情况何时以及如何发生?
编辑@每个答案
因此,我认为系统运行状况中可能会捕获很多不需要的事件。我怎样才能在这个系统运行状况中找到它们并过滤掉它们?
另外,我们应该增加文件大小,比如 200 MB 4 文件,还是只保留 10 MB 80 文件等小文件?哪一个更好?
更新@我已经将此标记为答案,但是在检查弹出的另一件事时:
文件未按顺序填写;假设我将 10 个文件增加到每个 10 MB。我们看到几天前的 1-6 个文件似乎都充满了 10 MB,而同一天的文件 7 和 8 是 2 MB,而文件 9 和 10 完全充满了 10 MB。我想这是意料之中的,只是好奇为什么会这样?
sql-server ×10
sql-server-2012 ×10
t-sql ×2
filestream ×1
logins ×1
performance ×1
replication ×1
restore ×1
scripting ×1
security ×1