我有需要支持 3 种不同语言的新 SQL Server 数据库。
如果我希望我的数据库支持以下内容,我需要选择哪些字符集和排序规则:
我对 T-SQL 和 SQL Server 组件有基本的了解。我的目标是掌握我的技能并学习有关 SQL Server 的一切,最终成为未来的 DBA。我想了解深入的 SQL Server 内部结构,一切究竟是如何工作的,何时以及为什么。你能给我推荐一个好的起点吗?恕我直言,通过编程工作是不可能的。
我不太知道如何表述这个问题,因为我们还不太了解,但我想早点问,因为这看起来不应该被忽视。
本周我们的数据库服务器开始出现问题。这似乎是一个数据一致性问题,即使在非常简单的查询和小表上也表现为超时。我们在本周早些时候通过重新启动服务器“修复”了这个问题,它消失了,但现在它似乎又回来了,这次是在更重要的表上。例如,我刚刚做了一些调查,我正在查看这样的查询:
SELECT * FROM table WHERE id = 1234
Run Code Online (Sandbox Code Playgroud)
对于特定的 ID。该表有大约 30 多万行。但它似乎只发生在一小部分记录中。我敢打赌,当我重新启动服务器或备份并在另一台服务器上恢复数据库时,一切都会好起来的。但是我会尝试。
此时,我正在运行:
DBCC CHECKTABLE ('table', NOINDEX)
Run Code Online (Sandbox Code Playgroud)
但它似乎将永远运行。当我们第一次遇到问题时,我检查了有问题的表格,结果很好。这张新桌子要大得多。
一些背景技术信息:
ELB 卷是“全新的”。我们在本周创建了它们。
编辑:我只是使用了以下命令:
SELECT
sqltext.TEXT,
req.session_id,
req.blocking_session_id,
req.wait_type,
req.wait_time,
req.last_wait_type,
req.wait_resource,
req.open_transaction_count,
req.transaction_id,
req.total_elapsed_time
FROM
sys.dm_exec_requests req
CROSS APPLY
sys.dm_exec_sql_text(req.sql_handle) AS sqltext
Run Code Online (Sandbox Code Playgroud)
并发现我的查询正在等待共享锁(LCK_M_S),其中阻塞会话正在等待另一个被不存在的会话阻塞的共享锁。
编辑 2:好的,会话存在(我发现它使用sys.dm_exec_sessions),但它现在似乎没有做任何事情。
编辑 3:我找不到任何关于会话的有趣内容。我看到它来自哪个网络服务器,但没有其他太多。
编辑 4: 编辑 4:我们在我们的代码中发现了一个可能的错误:一个不能确保数据库连接关闭的函数。另一方面,看起来函数使用的事务被正确处理,在这种情况下,所有的锁都应该被清除。我还不是很清楚,但这似乎是可能的原因。我们将修复该错误并密切关注它。
我们有几十个主服务器和相应的镜像,大多数都运行良好,但其中1个运行异常。具体来说,sp_dbmmonitorresults对于给定的主数据库,proc 将所有列返回为 NULL,而sp_dbmmonitorresults在镜像上返回有效信息:


现在,我大致知道原因是什么;当设置主服务器和镜像服务器时,主服务器上的区域设置不正确(时间正确但使用的是 +4 区域(美国等),在设置镜像后,时间区域更正为 GMT +0我知道男孩的错误,但是c'est la vie!)
编辑:19/12/2012
今天我删除了镜像,删除了镜像上的副本并重新设置了镜像,但是这并没有解决问题!我将在这个问题上悬赏以尝试找出问题的根源。
确认一下,如果我EXEC sp_dbmmonitorresults @database_name = 'ProScript'在每台服务器上手动运行,它会为主要服务器上的大多数值返回 NULL,但在镜像上返回正常,如下所示:
在主要运行时:
缩放:点击查看全尺寸版本
对着镜子跑的时候:
缩放:点击查看全尺寸版本
如您所见,时间是当前的并且数据库是同步的,但是主数据库上的 log_generation_rate、unsent_log、send_rate 等变量都为 NULL?
两台服务器都有监控作业每分钟运行一次,exec sys.sp_dbmmonitorupdate作为作业步骤等。
查看 sys.sp_dbmmonitorupdate 的来源,它从中获取这些值sys.dm_os_performance_counters- 所以如果我在镜像上运行以下内容:
SELECT counter_name ,
cntr_value
FROM sys.dm_os_performance_counters
WHERE instance_name = 'ProScript'
AND counter_name IN ( N'Log Send Queue KB', N'Log Bytes Sent/sec', N'Redo Queue KB', N'Redo Bytes/sec', N'Transaction Delay', N'Log Bytes Flushed/sec', N'Transactions/sec' )
Run Code Online (Sandbox Code Playgroud)
我得到了很好的结果:

但是,如果我在主数据库上运行相同的 SQL,则没有行! …
我要做的是查看我们的数据库并锁定所有auto-shrink设置,以及处理哪些数据库/表高度碎片化。
是否有我可以运行的特定脚本来获得每个数据库的好主意?
我知道我可以在每个表级别(至少 SQL Server 2005)运行以下内容:
DBCC SHOWCONTIG ('DB.TABLE');
Run Code Online (Sandbox Code Playgroud)
但是我可以运行什么来显示数据库中的所有表?
谢谢
大约每周一次,我必须解决 SQL Server 2005 数据库上的阻塞链,这是由 Access 2003 前端的长期读取锁引起的。每当用户打开某个表单时就会解除锁定,并在用户完成滚动表单或关闭表单后解除锁定。由于我们的许多用户打开此表单作为参考,因此这些锁会保留一段时间。对该表的任何更新都会导致阻塞,突然间没有人可以从该表中进行选择,因为他们都在等待第一个锁。这对我们来说是一个很大的问题,因为许多应用程序都依赖于这些数据。我知道这种锁定行为是 Access 如何处理链接表的一部分。
我一直在通过 Activity Monitor 解决这个问题,只要我发现它,就会杀死任何一个是 Head Blocker 的 SELECT 进程。这是一个问题,不仅因为我手动完成它需要时间,还因为它是被动的。当我听说它时,它已经成为很多人的问题。
我想知道是否有一种自动方法来检查这些持久的阻塞链,并通过电子邮件发送或自动解决问题。逻辑看起来很简单(“如果任何与此 SELECT 查询匹配的进程阻塞了超过一分钟,请通知我/杀死它”)但我不知道如何使用 SQL Server 实现这一点。
对于它的价值,我认为正确的解决方案是修复或重写应用程序。然而,由于部门政治,这不是未来几个月的选择,所以我正在寻找一个权宜之计。
我有一个数据库,可以根据嵌入鞋子中的 RFID 标签跟踪人们。此数据到达VARCHAR(MAX)与其他数据混合在一起的列中,没有特定的顺序。到目前为止,所有 RFID 值的格式如下:
AnnnnnnnnAnnAAAA (where A = 0-9 and n = A-Z)
Run Code Online (Sandbox Code Playgroud)
我正在写一份报告,从这些消息中提取 RFID 并将它们存储在他们自己的表中。只要 RFID 遵循相同的模式,我就可以找到它们。如果 RFID 格式发生变化,我的提取过程将失败。
RFID标签有标准格式吗?哪种数据类型最适合存储 RFID 标签?
我现在就去VARCHAR(20)。
我们有一张付款表,代理商会收到付款佣金。佣金取决于几个不同的因素,例如收到付款需要多长时间,因此在计算代理获得的佣金率时会涉及一些计算,但并不复杂。
例如,它可能永远不会比这更复杂:
SELECT Payments.Amount * CASE
WHEN DateDiff(year, Client.Received, Payments.DatePaid) = 1 THEN Rates.Rate1
WHEN DateDiff(year, Client.Received, Payments.DatePaid) = 2 THEN Rates.Rate2
ELSE Rates.Rate3 END
Run Code Online (Sandbox Code Playgroud)
构建第二个表来保存这些数据而不是在需要时随时查询是否有意义?或者我应该坚持使用在请求时提取数据的运行时查询?
更重要的是,在确定是否应该在需要数据的任何时候运行查询,或者数据是否应该存储在它自己的单独表中时,要使用哪些因素?
我的系统中有很多死锁。
我想使用快照隔离来修复它们,但我的 DBA 对此有所保留。
他的担忧之一是快照隔离会减慢写入速度。这是因为它必须先写入缓存,然后写入 TempDb(行版本),然后才能返回给调用者。
“正常”写入可以只写入缓存然后完成。
这是行版本控制的工作方式吗?或者比这更复杂?它是否以某种方式并行执行这些操作?
还是快照隔离的写入速度较慢?
sql-server-2008 sql-server sql-server-2008-r2 snapshot isolation-level
我有一个大表(数千万到数亿条记录),出于性能原因,我们将其拆分为活动表和存档表,使用直接字段映射,并每晚运行存档过程。
在我们代码的几个地方,我们需要运行结合活动表和存档表的查询,几乎总是由一个或多个字段过滤(我们显然在两个表中都放置了索引)。为方便起见,有一个这样的视图是有意义的:
create view vMyTable_Combined as
select * from MyTable_Active
union all
select * from MyTable_Archive
Run Code Online (Sandbox Code Playgroud)
但是如果我运行一个查询
select * from vMyTable_Combined where IndexedField = @val
Run Code Online (Sandbox Code Playgroud)
它将在过滤之前对Active 和 Store 中的所有内容进行联合@val,这会降低性能。
@val在创建联合之前,是否有任何巧妙的方法可以让联合的两个子查询查看每个过滤器?
或者,您可能会建议使用其他一些方法来实现我的目标,即一种简单有效的方法来获取由索引字段过滤的联合记录集?
编辑:这是执行计划(您可以在这里看到真实的表名):

奇怪的是,活动表实际上使用了正确的索引(加上 RID 查找?)但存档表正在执行表扫描!