数据库管理员

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

1
比较SQL Server 2012中的两个查询
我正在比较SQL Server 2012中的两个查询。目标是在选择最佳查询时使用查询优化器中所有可用的相关信息。这两个查询产生相同的结果。所有客户的最大订单编号。 在使用FREEPROCCACHE和DROPCLEANBUFFERS执行每个查询之前,已清除缓冲池 使用下面提供的信息,哪个查询是更好的选择? -- Query 1 - return the maximum order id for a customer SELECT orderid, custid FROM Sales.Orders AS O1 WHERE orderid = (SELECT MAX(O2.orderid) FROM Sales.Orders AS O2 WHERE O2.custid = O1.custid); -- Query 2 - return the maximum order id for a customer SELECT …

2
高效的查询,以从大表中获取每个组的最大价值
给定表: Column | Type id | integer latitude | numeric(9,6) longitude | numeric(9,6) speed | integer equipment_id | integer created_at | timestamp without time zone Indexes: "geoposition_records_pkey" PRIMARY KEY, btree (id) 该表有2000万条记录,相对而言,这不是一个很大的记录。但这会使顺序扫描变慢。 如何获得max(created_at)每个记录的最后一条记录()equipment_id? 我已经尝试了以下两个查询,并阅读了有关该主题的许多答案的几种变体: select max(created_at),equipment_id from geoposition_records group by equipment_id; select distinct on (equipment_id) equipment_id,created_at from geoposition_records order by …

5
在数据库中共享一个主键序列?
将单个序列用作所有表的主键是否可以接受(不是主键对于给定表是唯一的,而是所有表都是唯一的)?如果是这样,从客观上讲,它比在表中使用单个主键序列更好。 我是一名初级软件开发人员,而不是DBA,因此我仍在学习良好数据库设计的许多基础知识。 编辑:如果有人想知道的话,我最近读了我们公司的一名DBA对数据库设计的评论,他提到了一个问题,即设计没有在整个数据库中使用单个主键,这听起来与事实不同。到目前为止,我已经学到了。 Edit2:要回答注释中的问题,这是针对Oracle 11g的,但是我想知道的是非数据库特定级别。如果这个问题确实取决于数据库,我很想知道为什么,但是在这种情况下,我将寻找针对Oracle的答案。

1
SQL Server多对一复制
我有8台单独的SQL Server 2008 R2计算机,每台托管1个数据库。每个数据库都有相同的表结构和架构,以及完全唯一的数据。 我想建立一个报表服务器(可能是2008或2012),它将来自8个源服务器的选定表中的行合并到报表服务器上那些表的单个实例中。这是单向复制(不会对报告服务器进行任何更改)。我将需要以相对较低的延迟(例如20-30秒)从源数据库复制更改。 此外,我想找到一种方法来实现这一目标,并且对源服务器的影响尽可能小。在我的环境中,那些服务器的第三方代理,触发器或架构模块很困难。 我的问题: 有哪些有希望的架构和技术可以实现这一目标? 我看过SQL Server合并复制,但是我担心延迟。这是实现此目标的合适技术吗? 是否有用于事务复制的多对一体系结构? 我应该查看报表服务器上8个数据库的1对1复制,然后进行一些自定义合并功能(两步复制)吗? 谢谢,约翰

5
强制SQL Server按照编写的条件运行查询条件?
我正在使用SQL Server 2008 R2,并且具有以下伪查询(SP): select ... from ... WHERE @LinkMode IS NULL AND (myColumn IN (...very long-running query...)) ... ... 问题是查询要花很长时间才能执行-即使我使用来执行SP @LinkMode=2。 正如您所注意到的,只有在@LinkMode为null时才应执行长时间运行的查询,在这种情况下不是这样。在我的情况下,@LinkMode = 2! 但是,如果我将其更改为: select ... from ... WHERE 1=2 AND (myColumn IN (...very long time exeted query...)) ... ... SP 确实运行很快。 我之前听说过,有时优化器可以优化条件的顺序。 所以我问: 即使优化器选择了其他路径,比检查if更快=null呢?我的意思是,我认为检查if a==null是多比正在运行的其他长的查询速度更快... 如何强制 SQL …




3
外键-使用代理键还是自然键链接?
对于表之间的外键应该链接到自然键还是代理键,是否存在最佳实践?我真正发现的唯一讨论(除非缺少我的google-fu)是杰克·道格拉斯在这个问题上的答案,他的推理对我来说似乎很合理。我知道有关规则会发生变化的讨论之外,但是在任何情况下都需要考虑这一点。 提出这个问题的主要原因是,我有一个使用带有自然键的FK的遗留应用程序,但是开发者大力推动将其移至OR / M(在我们的例子中为NHibernate),并且一个fork已经产生了一些东西。中断更改,因此我希望使用自然键将它们推回正轨,或者移动旧版应用程序以使用FK的替代键。我的直觉说要恢复原始的FK,但是老实说,我不确定这是否是正确的选择。 我们的大多数表都已经定义了代理键和自然键(尽管有唯一约束和PK),因此在这种情况下,不必添加额外的列对我们来说不是问题。我们正在使用SQL Server 2008,但是我希望这对于任何数据库都足够通用。

4
如何为两个表的MySQL建模
我有一些表用于存储数据,并取决于完成工作的人的类型(工人,民事人员),我想将其存储在event表中,现在这些人抢救出了一只动物(有一个animal表)。 最后,我想有一张桌子来存储一个人(工人,土木工人)救了一只动物的事件,但是弓箭我应该添加一个外键或者如何知道id完成这项工作的土木工人或工人的价值? 现在,在这种设计中,如果我只有一个人(又称民事人员),我不知道如何关联哪个人做这项工作,我只会将这个civil_id谷值存储person在最后一张表中的列中……但是如何知道是土木还是工人,我是否需要其他“中级​​”表? 如何在MySQL中反映下图的设计? 额外细节 我通过以下方式对其进行建模: DROP TABLE IF EXISTS `tbl_animal`; CREATE TABLE `tbl_animal` ( id_animal INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(25) NOT NULL DEFAULT "no name", specie VARCHAR(10) NOT NULL DEFAULT "Other", sex CHAR(1) NOT NULL DEFAULT "M", size VARCHAR(10) NOT NULL DEFAULT "Mini", edad VARCHAR(10) NOT …

5
TRY-CATCH未捕获链接的服务器错误
我正在设置一项工作,以遍历链接服务器的列表并针对每个服务器执行特定的查询。我正在尝试在TRY-CATCH块中执行查询,因此如果一台特定服务器存在问题,我可以将其记录下来,然后继续使用其他服务器。 我在循环内执行的查询如下所示: BEGIN TRY SELECT * FROM OPENQUERY([server1], 'SELECT 1 AS c;'); END TRY BEGIN CATCH SELECT ERROR_NUMBER(), ERROR_MESSAGE(); END CATCH; PRINT 'We got past the Catch block!'; 如果连接到服务器有问题,则代码立即会立即失败,并且不会传输到CATCH块中。如果服务器连接但实际查询中存在错误(例如,除以零),则该错误将被该CATCH块捕获。 例如,我创建了一个链接服务器,其名称不存在。执行上面的代码时,我得到: OLE DB provider "SQLNCLI" for linked server "nonserver" returned message "Login timeout expired". OLE DB provider "SQLNCLI" for linked server …


1
授予从系统表中选择的权限
我有一个数据库Microsoft SQL Server 2008 r2。定义了一个名为marie的用户,该用户可以访问主数据库上的表。这很好。现在,我希望marie能够执行以下查询: SELECT resource_type,spid,login_time,status,hostname,program_name,nt_domain,nt_username,loginame FROM sys.dm_tran_locks dl JOIN sys.sysprocesses sp on dl.request_session_id = sp.spid 涉及的表是主表;如何授予玛丽向他们阅读的权限?我已经尝试过以dbo执行以下命令: GRANT ALL on sys.dm_tran_locks TO marie GRANT ALL on sys.sysprocesses TO marie 不过,当玛丽尝试执行上述查询时,错误是: Msg 297, Level 16, State 1, Line 1 The user does not have permission to perform this action. 我究竟做错了什么?
14 sql-server 

2
如何在MySQL中使用REGEXP使用SUBSTRING
我有以下情况。我必须使用MySQL对描述中的正则表达式进行细分。描述: Lorem D9801 ipsum dolor坐在amet 其中D9801是REGEXP。每个强文本描述都有不同的内容,但我的正则表达式应类似于:REGEXP'D [[:digit:]] {4}' REGEXP的开头始终为“ D”,结尾始终为“ xxxx”-4位数字:Dxxxx 我知道REGEXP仅返回true / false值,但是如何进行查询以仅返回'D9801'值? 我尝试过这样的事情: SELECT SUBSTRING (description, LOCATE(REGEXP 'D[[:digit:]]{4}', description), 5) FROM ( SELECT "Lorem D9801 ipsum dolor sit amet" AS description ) temp 我知道这是错误的,因此我尝试使用此方法: SELECT id, SUM(description REGEXP 'D[[:digit:]]{4}') AS matches, CASE WHEN (SUM(description REGEXP 'D[[:digit:]]{4}') > 0) …

1
将主键移到文件组(SQL Server 2012)
如何将群集的主键移动到新文件组?我已经找到了可能的“算法”,但是效率很低: 删除非集群索引(要求对它们进行重新排序和重建) 删除聚簇索引(要求使用整个表) 创建新的主键约束(巨大的排序操作) 创建所有非聚集索引(需要排序和写入) 有没有更有效的方法?这是非常低效的,并且由于弱服务器上的表大小为50GB,将花费很长时间。 是否没有办法跳过所有这些,只对新文件组进行重建?那将不需要任何数据排序。

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.