数据库管理员

希望提高数据库技能并向社区中的其他人学习的数据库专业人员的问答

1
如何插入默认行?
如果我创建一个以标识列作为主键的表,而其他所有列均具有默认值,例如 create table rr (id int identity(1,1) primary key, dt datetime default getdate())
11 sql-server 

2
SQL Server 2008 R2使用事务日志还原COPY_ONLY完整备份
经过一些研究,我似乎找不到这个问题的答案。 背景我正在尝试设置一个符合以下三个要求的备份计划: 备份的可靠性,每晚进行一次完整备份 可以从中还原的事务日志备份 磁盘空间不足 备份必须在本地可用于审核工具 因此,为了满足这些需求,我正在考虑每周进行完整备份,每天进行差异备份以及每小时进行一次备份。然后,每天晚上将运行可在异地运送的copy_only备份,这样做是为了使日志链不会损坏,并且我们可以在可靠的夜间进行完整的异地备份,而不必占用太多本地磁盘空间。 问题是否可以从copy_only备份还原,然后再还原事务日志。 让我举一个例子,让您知道我在说什么。 使用下面的列表,我想知道是否可以还原FullbackupCOPY_ONLYC.bak,然后还原TransactionbackupG.trn,TransactionbackupH.trn,最后是TransactionbackupI.trn > ---List of Backups--- FullbackupA.bak 01/01/2013 00:00:00 > DifferntialbackupA.bak 02/01/2013 00:00:00 FullbackupCOPY_ONLYA.bak 02/01/2013 00:00:00 > TransactionbackupA.trn 02/01/2013 01:00:00 > TransactionbackupB.trn 02/01/2013 02:00:00 > TransactionbackupC.trn 02/01/2013 03:00:00 > DifferntialbackupB.bak 03/01/2013 00:00:00 FullbackupCOPY_ONLYB.bak 03/01/2013 00:00:00 > TransactionbackupD.trn 03/01/2013 01:00:00 > TransactionbackupE.trn 03/01/2013 …

3
RESTful API的SQL数据库结构
我正在创建一个RESTful API。我正在努力决定围绕我的资源设计数据库表的最佳方法。 最初,尽管每个资源一个表都是一个不错的方法,但是现在我担心这会导致在资源链越远的地方,表成指数增长。 例如,假设我有三个资源-用户,客户,销售。用户是我api的订阅者,客户是用户客户,销售是每个客户对用户帐户的购买。 如下访问销售资源 GET /users/{userID}/clients/{clientID}/sales/{salesID} 因此,如果有10个用户,每个用户有10个客户,并且每个客户有10个销售量,那么随着我们走的资源链越远,表的大小就越大。 我相当有信心SQL可以应付大表,但是我不确定读写会如何减慢速度。上面的示例可能没有说明,但是我的api会在我们走的资源链中越来越多地进行更多的写入和读取。因此,在这种情况下,数据库中最大的表的读取和写入次数要比较小的表更多。 在运行查询之前,也有必要联接表。原因是我允许每个用户拥有一个具有相同名称的客户端。为避免获取错误的客户端数据,{userID}将users表和clients表连接在一起。销售情况也是如此。联接大表并运行会进一步降低读写速度吗?

1
为什么SQL Server在将它与一个int变量进行比较之前需要将count(*)结果转换为int?
我的应用程序中有很多查询,在Have子句中,我有count聚合函数与int变量的比较。在查询计划中,我可以在比较之前看到一个implicit_convert。我想知道为什么会这样,因为根据sql Server文档,count函数的返回类型是int。那么为什么要有一个隐式转换来比较两个int值呢? 以下是一个这样的查询计划的一部分,其中@IdCount被定义为一个int变量。 |-过滤器(WHERE:([[Expr1022] = [@ IdCount]))) |-计算标量(DEFINE:([[Expr1022] = CONVERT_IMPLICIT(int,[Expr1028],0))) |-流聚合(组BY:([[MOCK_DB]。[dbo]。[Scope]。[ScopeID])DEFINE:([Expr1028] = Count(*)))


1
一个基于大型记录的数学数据库的平台是什么?
嗨,我是一位土木工程师,具有一定的编程经验,但是我对当今可用的各种选择并不熟悉。希望您能给我任何建议以最好的方式进行。 我想以网格格式制作和查询地面测量数据的数据库。在土方作业的各个时间,每个网格位置都会有很多测量值,因此存在第4维时间。 观察结果很可能会从文本文件中读取。在每个记录中,将有一个(2 x整数)个网格位置(行和列),一个(浮点)地平面以及各种字符串信息代码(总共最多30个字符)。 网格可以是大约10000行x 10000列。并非每次调查中网格上的每个位置都会有一个记录,但是通常它们最多会包含一百个记录。许多网格位置根本没有记录(该站点将不是完美的矩形)。 我想搜索记录,提取数据并进行计算,例如计算每个网格位置的最低或最高地面高度。我非常有信心,我能够使用数组使用FORTRAN,BASIC或C这样的语言简单地对此进行编程。尽管很多数组元素都是空的,但我想这并不是正确的方法,而像这样的大型数据库则需要特殊的工具,我将不得不学习如何使用它们。 我正在考虑该平台的可能选择- 使用数据库程序。我不熟悉这些功能的功能,但我想他们使用GUI会产生很多开销。 使用SQL?我对此了解不多,但这似乎是数据库的语言。我一直使用命令式语言而不是声明性语言,并且据维基百科了解,SQL是声明性语言,我对此变化感到有些紧张。我不完全了解使用它的过程。是否有制作控制台程序的编译器?数据库是否存储在磁盘上?很抱歉这样愚蠢的问题。 使用c-treeACE之类的API?我认为这可能是让我熟悉“​​先做然后再做”语言的一种方法(不幸的是,这是我作为工程师的想法!)。但是我希望API提供的后台内存和处理管理将优于我使用大型数组可以实现的功能。 还是我可以使用面向对象的语言来完成它,而让计算机担心存储需求。例如,如果我将记录存储为具有方法和属性的对象,这些方法和属性可以帮助我从每条记录中获取所需的结果,那么与3相比,这将是一个huge肿的程序吗? 可能有数亿条记录,我希望能够在运行Windows的现代PC上在几分钟而不是几小时(最好是几秒钟!)内查询和处理它们。更具体地说,我的是i6处理器,具有6Gb内存和120Gb SSD,运行Windows 7 64位。 希望有人有时间与新手分享一些智慧的话。

4
某些用户查询缓慢
我从C#.NET Web应用程序中调用了几个查询,这些查询对我来说总是很快的(我是SQL Server上的本地管理员),但是对于一组用户(具有所需权限的域组)而言,查询速度却非常慢它在应用程序中超时的点。 是什么导致完全相同的查询针对不同的用户运行不同? 更多信息: 该查询是C#代码中的内联SQL,而不是存储过程 该应用程序使用域身份验证,用户和我自己都可以通过该应用程序运行查询 似乎问题出在不同的计划上,其中一个已被缓存,因此这对于不同的用户来说是不同的。某些因素正在影响缓存,因为现在通过应用程序查询对我来说很慢,而在SQL Server Management Studio中则很快。

1
由于索引锁定顺序,SQL Server两次更新发生死锁
我有两个UPDATE-一个先锁定CI,然后再锁定NCI(处于状态),因为status列也在被更新。另一个已经在NCI上拥有U锁,因为它知道它正在更改,然后尝试在CI上获取U锁。 强制这些序列化的最简单方法是什么?使用TABLE级别的提示似乎很奇怪,因为这是一个内部索引问题-仅涉及一个表-UPDLOCK和HOLDLOCK是否会自动应用于该表上所需的所有索引,从而强制对其进行序列化? 以下是查询: UPDATE htt_action_log SET status = 'ABORTED', CLOSED = GETUTCDATE() WHERE transition_uuid = '{F53ADDDA-E46B-4726-66D8-D7B640B66597}' AND status = 'OPEN'; 一个X锁定CI(在CREATED列上)中的行,然后尝试X锁定包括状态列的NCI。 UPDATE htt_action_log SET status = 'RUNNING {36082BCD-EB52-4358-E3D3-4D96FD5B9F0F} 1360094342' WHERE action_uuid = (SELECT TOP 1 action_uuid FROM htt_action_log WHERE transition_uuid = '{F53ADDDA-E46B-4726-66D8-D7B640B66597}' AND status = 'OPEN' ORDER BY action_seq) 这个U锁定相同的NCI-对于我猜的嵌套查询,然后锁定CI进行更新。 …

2
从不同版本的备份文件还原数据库
我读到,出于向后兼容的原因,只要您从旧版本还原到新版本,就可以在SQL Server中还原数据库。 有谁知道您是否可以从* .bak文件中为不同版本的SQL Server还原数据库?我们正在通过FTP移动一个非常大的数据库,这将需要几天时间,因此我们只愿意这样做一次。如果在通过FTP传输数据库时没有人响应,我们显然会尝试一下,通过测试看看它是否有效,然后回答我们自己的问题。 以下是获取SQL Server版本详细信息的查询。该productversion格式为{major revision}.{minor revision}.{release revision}.{build number}。在我的情况下,对于源和目标,{release revision}值均为。这样看起来还可以。但是,是不同的。55005512edition 查询: SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY('productlevel'), SERVERPROPERTY('edition') 源数据库: 10.0.5500.0 SP3 Developer Edition (64-bit) 目标数据库: 10.0.5512.0 SP3 Enterprise Edition (64-bit)

1
为什么SQL Server查询不使用超过7MB /秒的磁盘I / O
我有一个固态硬盘,使用IOmeter测试,显示性能超过200MB / s。但是,当我从本地计算机运行任何SQL查询时,Windows资源监视器从不显示高于7MB /秒的磁盘IO。即使对于耗时超过2分钟的查询,这也适用。瓶颈仅来自SSD的7MB /秒是什么? 我在跑: Windows Server 2012标准版 SQL Server 2008 R2 英特尔i7 3820 内存32GB Sandisk SSD

1
Qcache_free_memory还不满,我得到了很多Qcache_lowmem_prunes
我刚刚开始涉足CMS的查询缓存。 谁能告诉我(或至少提供一个良好的猜测)为什么我得到了很多的Qcache_lowmem_prunes时候有一半以上Qcache_free_memory是免费的吗? query_cache_size=512M query_cache_limit=1M 这是大约12小时后的样子 show status like '%qcach%'; +-------------------------+-----------+ | Variable_name | Value | +-------------------------+-----------+ | Qcache_free_blocks | 10338 | | Qcache_free_memory | 297348320 | | Qcache_hits | 10254104 | | Qcache_inserts | 6072945 | | Qcache_lowmem_prunes | 725279 | | Qcache_not_cached | 2237603 | | Qcache_queries_in_cache | 48119 …

1
PostgreSQL pg_stat_activity显示COMMIT
最近,我们用具有4个四核CPU和32Gb内存的升级机器替换了数据库服务器。我们还重新调整了旧盒子的用途,以充当流复制的从设备。两个盒子都运行CentOS 6.3和PostgreSQL 9.2。Postgres是运行在每个盒子上的唯一东西。 这种配置已经部署了大约一个月左右,当流量突然增加时,突然我们开始遇到一些问题。我们开始看到的是,有时CPU的负载非常高(顶部显示的平均负载为270),当我们查看时,pg_stat_activity我们将看到大多数连接处于该COMMIT状态。单独放置时,它最终将完成,并且系统将随着连接变为作出响应IDLE。我们尝试禁用复制以查看是否可能是问题所在,但问题仍然存在。 我们已经尝试诊断正在发生的事情,并且有些丢失。运行的输出perf显示类似于以下内容,我不知道0x347ba9代表什么。 + 41.40% 48154 postmaster 0x347ba9 f 0x347ba9 ◆ + 9.55% 10956 postmaster 0x2dc820 f set_config_option ▒ + 8.64% 9946 postmaster 0x5a3d4 f writeListPage + 5.75% 6609 postmaster 0x5a2b0 f ginHeapTupleFastCollect ▒ + 2.68% 3084 postmaster 0x192483 f build_implied_join_equality ▒ + 2.61% 2990 postmaster 0x187a55 f …
11 postgresql 

2
事务日志文件的内容更详细
我有一个关于事务日志(简称为LDF)内容的问题。我假设数据库具有完整的恢复模型。 我已经读到LDF文件包含(记录)对数据库的每个操作(处于完全恢复模式)。与期间记录BEGIN TRAN; COMMAND(s); COMMIT有何不同?我问是因为显然您可以回滚事务,但是您不能回滚标准命令(在完全恢复模式下)。 我猜想在事务处理期间,被记录到LDF文件中的内容与常规的完全恢复日志记录中的内容不同。那正确吗?有什么不同?难道每个动作都只包含“撤消”操作吗? 在相关说明中,我听说有使用完整恢复LDF文件来“回滚/撤消”标准查询的商业工具。他们是如何做到的呢?他们是否分析LDF内容并尝试提出逆/撤消运算?

1
来自更远的调用堆栈的DB_ID上下文
在SQL Server中,是否可以DB_ID从较远的调用堆栈中从上下文中获取? 我的目标是在dev沙箱数据库中创建一些方便的工具(并且很容易被发现),使给定其短名称或零散名称的对象的标准名称变得简单明了,并使用相同的短名称删除对象。这些实用程序功能将在单个实用程序数据库中,但会从同一服务器上的其他数据库调用。 从测试中我可以看到: ORIGINAL_DB_NAME()按预期返回连接字符串中的内容,而不是当前上下文(由设置USE [dbname])。 在函数中调用时,DB_NAME()返回定义该函数的数据库的名称。换句话说,函数或存储过程内部的上下文是定义该上下文的数据库的上下文 我知道引擎会跟踪调用堆栈上下的每个数据库上下文(请参见下面的证明)。那么有什么方法可以访问此信息? 我希望能够在调用者数据库的上下文中找到对象并对其进行操作,即使执行代码不在同一数据库中也是如此。例如: use SomeDB EXEC util.dbo.frobulate_table 'my_table' 我知道我能做 EXEC util.dbo.frobulate_table 'SomeDB.dbo.my_table' 但是我真的很好奇,是否可以通过这种方式查询调用堆栈。 更新/注释 我确实从Gabriel McAdams的博客中阅读并下载了代码。这提供了堆栈上上下的调用过程ID的记录,但仍假定所有内容都在同一数据库中。 证明SQL Server可以记住数据库上下文上下调用堆栈 示例:在具有数据库TestDB1和TestDB2的开发服务器上 use TestDB1 GO CREATE FUNCTION dbo.ECHO_DB_NAME() RETURNS nvarchar(128) BEGIN RETURN DB_NAME() END GO use TestDB2 GO CREATE PROCEDURE dbo.ECHO_STACK AS BEGIN DECLARE @name nvarchar(128) SET …
11 sql-server 


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.