数据库管理员

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

2
我可以从自引用(分层)表中获取树结构吗?
给定这样的层次表: CREATE TABLE [dbo].[btree] ( id INT PRIMARY KEY , parent_id INT REFERENCES [dbo].[btree] ([id]) , name NVARCHAR(20) ); 我想获得整个树结构。 例如,使用以下数据: INSERT INTO [btree] VALUES (1, null, '1 Root'); INSERT INTO [btree] VALUES (2, 1, '1.1 Group'); INSERT INTO [btree] VALUES (3, 1, '1.2 Group'); INSERT INTO [btree] VALUES (4, …

1
外部服务器的权限被拒绝
我试图建立一个具有有限权限的用户,该用户将能够创建外部表。我有两个数据库,hr_db和accounting_db。我已经hr_user为hr_db和创建了一个accounting_user用户accounting_db。我只希望accounting_user用户对某些hr_db表(例如表)具有选择权限users。为此,以超级用户身份进入hr_db数据库并运行: GRANT CONNECT ON DATABASE hr_db TO accounting_user; GRANT SELECT ON people TO accounting_user; 我设置了一个连接hr_db从accounting_db使用外国数据包装: CREATE SERVER hr_db FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'localhost', dbname 'hr_db', port '5432'); 然后,我为accounting_user用户添加了一个映射: CREATE USER MAPPING FOR accounting_user SERVER hr_db OPTIONS (user 'accounting_user', password 'secretpassword'); 的密码accounting_user与我从命令行登录时使用的密码相同。这很好用: psql -U accounting_user -W hr_db [enter accounting_user …

2
选择从指定值开始直到另一个指定值的行
我有一个包含几个列的表,想要检查一个列值,选择该列值之后的行,直到显示一个单独的列值。我尝试使用BETWEEN,但是如果列值是整数,则仅查找整数之间的数字。 例如,如果我有一个这样的表: id时间值 t1 12:00 PM 15 t1 12:02 PM 4 t1 12:03 PM 7 t1 12:05 PM 16 t5 12:10 PM 250 t5 12:15 PM 15 t8 11:00 AM 15 t8 3:00 PM 2 t8 3:05 PM 100 t2 7:00 PM 15 t2 7:01 PM 16 t15 5:00 AM …

3
有人可以解释执行数百万次更新的怪异行为吗?
有人可以向我解释这种行为吗?我在OS X本机上运行的Postgres 9.3上运行了以下查询。我试图模拟一些行为,其中索引大小可能变得比表大小大得多,而发现了一些更奇怪的事情。 CREATE TABLE test(id int); CREATE INDEX test_idx ON test(id); CREATE FUNCTION test_index(batch_size integer, total_batches integer) RETURNS void AS $$ DECLARE current_id integer := 1; BEGIN FOR i IN 1..total_batches LOOP INSERT INTO test VALUES (current_id); FOR j IN 1..batch_size LOOP UPDATE test SET id = current_id + …

2
Mongodump确实影响应用程序性能
我们有一个很大的mongo实例(150 GB),没有分片,而我们的常规备份(mongodump)对应用程序性能有非常重要的影响。更糟糕的是,由于该应用大量使用mongo,备份持续了10多个小时。 我知道我们需要分片,并且我们计划迁移到ElasticSearch,因此我正在寻找一些短期解决方案。 我可以做些什么来改善此情况,例如限制mongodump每秒的查询数量或其他任何操作? 我们在32核190 GB RAM服务器上有一个独立的mongo,与nginx,rabbitmq和一些小东西共享它。我知道这不是最干净的设置:)
8 backup  mongodb 

4
并发团体预订的策略?
考虑一个座位预订数据库。有一个n个席位的列表,每个席位都有一个属性is_booked。0表示不是,1表示是。任何更高的数量,都有一个超额预订。 在不允许超额预定的情况下进行多笔交易(每笔交易将同时预订一组y个席位)的策略是什么? 我只需选择所有未预订的座位,从中随机选择一组y,然后全部预订,然后检查预订是否正确(也就是is_booked的数量未超过一个,这表示已预订了该座位的另一笔交易,提交),然后提交。否则中止并重试。 这在Postgres中的隔离级别Read Committed上运行。

7
如何在定界符之后生成所有尾随子字符串?
给定一个可能包含定界符的多个实例的字符串,我想生成该字符之后的所有子字符串。 例如,给定一个类似'a.b.c.d.e'(或array {a,b,c,d,e})的字符串,我想生成一个类似以下的数组: {a.b.c.d.e, b.c.d.e, c.d.e, d.e, e} 预期的用法是触发填充一列,以便每当写入另一列时都q.x.t.com可以更轻松地查询域名部分(即查找所有要查询的内容t.com)。 解决这个问题似乎很尴尬(也许很好),但是现在我很好奇如何用(Postgres')SQL编写这样的函数。 这些是电子邮件域名,因此很难说出元素的最大数量是多少,但是可以肯定的是绝大多数元素都小于5。

1
在SQL Server中是否已记录$ IDENTITY并且可靠?
我了解到SQL Server可以使用伪列返回表的(单个)标识列的值$IDENTITY: SELECT $IDENTITY FROM Table 此功能是否已记录且可靠?唯一官方提及的内容是在IDENTITY页面上,但它已包含在代码示例中。这表明它可能打算不做记录。与此功能相匹配的Google也很少。

3
在数字表上交叉连接以获得线顶点,是否有更好的方法?
问题: 我有一个空间表(路线),使用ESRI的SDE.ST_GEOMETRY用户定义数据类型存储在Oracle 12c 地理数据库中。我想列出线顶点,以便最终访问并更新它们的坐标。如果使用的是SDO_GEOMETRY / Oracle Locator,则可以使用该 SDO_UTIL.GETVERTICES功能。但是我没有使用SDO_GEOMETRY / Oracle Locator,并且中没有等效功能SDE.ST_GEOMETRY。我可以找到的与顶点有关的唯一SDE.ST_GEOMETRY 函数是ST_PointN和ST_NumPoints。 我想出一个可以成功完成所有操作的查询-将行顶点作为行(受此页面的启发): 1 SELECT a.ROAD_ID 2 ,b.NUMBERS VERTEX_INDEX 3 ,a.SDE.ST_X(SDE.ST_PointN(a.SHAPE, b.NUMBERS)) AS X 4 ,a.SDE.ST_Y(SDE.ST_PointN(a.SHAPE, b.NUMBERS)) AS Y 5 FROM ENG.ROADS a 6 CROSS JOIN ENG.NUMBERS b 7 WHERE b.NUMBERS <= SDE.ST_NumPoints(a.SHAPE) 8 --removed to do explain plan: ORDER …

1
UPDATE堆表-> RID上的死锁
我正在建立一个测试案例,以证明一定的僵局情况,并且需要对正在发生的事情有一些了解。我有一个堆表,方便地称为HeapTable。该表由2个事务类似地更新。 交易1: BEGIN TRAN UPDATE HeapTable SET FirstName = 'Dylan' WHERE FirstName = 'Ovidiu'; WAITFOR DELAY '00:00:15'; UPDATE HeapTable SET FirstName = 'Bob' WHERE FirstName = 'Thierry'; ROLLBACK TRANSACTION 交易2: BEGIN TRAN UPDATE HeapTable SET FirstName = 'Pierre' WHERE FirstName = 'Michael'; ROLLBACK TRAN 我先触发事务1,紧接着触发事务2。正如预期的那样,事务1将要求一些互斥锁以及一些意图互斥锁。事务2将进入并请求在同一RID上进行更新锁定: spid dbid ObjId IndId Type …

1
为什么EXEC语句的query_hash为零?
我正在使用扩展事件为SQL Server设置监视系统,以查找繁重的查询作为开发人员的“生产反馈”。我正在使用event sp_statement_completed和sql_statement_completed,并在cpu_time,逻辑读取等上使用谓词过滤器。我希望将结果聚合在一起,database_name并query_hash像在Internet上的众多示例中所展示的那样,但是在结果中,我看到query_hash所有语句的结果均为0使用EXEC,如下表所示(时间戳和queryhash缩短了可读性)。 name timestamp query_hash plan_handle statement sql_statement_completed 2016...6414 0 050056019600764... exec Shared.dbo.SyncFirm sql_statement_completed 2016...9946 0 06003d00e01e730... exec spSetUserAuth @userid; sql_statement_completed 2016...7184 0 0600e30028c9da0... exec spSetUserAuth @userid; sp_statement_completed 2016...0409 9826...578 0600c00028e6aa0... SELECT obfuscated_columns FROM dbo.SomeTable sp_statement_completed 2016...1448 8660...775 060084006d2d660... INSERT INTO dbo.SomeTable ( obfuscated_columns) EXEC(@sql) sql_statement_completed 2016...7752 0 0600f9006c23f03... …

1
“累积快照”事实表中的“测量类型尺寸”
我有一个累积的快照事实表,该表跟踪终端中容器的进入和退出。 容器可以以3种不同的方式进入和退出,因此我想创建一个特定的尺寸表,其中列出了这3种可能的方式(火车,轮船或卡车)。 然后我读了这篇文章,基本上说这种技术是错误的,但我不明白为什么。 第一篇文章: 有时,当事实表的一长串事实稀疏地填充在任何单独的行中时,它很想创建一个度量类型维度,以将事实表行折叠为由度量类型维度标识的单个通用事实。我们通常不建议这种方法。尽管它删除了所有空的事实列,但将事实表的大小乘以每行中已占用列的平均数,这使列内计算更加困难。当潜在事实的数量极高(数百个)时,此技术是可以接受的,但对于任何给定的事实表行,只有极少数适用。 我了解,如果为事务事实表实现了“ 度量类型维 ”,则可能会产生其他文章所述的问题,但是如果用于累积快照事实,我看不到任何不利之处。 第二篇文章:( 实现“度量类型维”的一些缺点) [...]如果我们使用“度量类型维”,我们将失去这种分析能力。如果一项措施与其他措施不兼容,我们将无法将其相加。 [...]我们的SQL运行以生成报告所需的传递次数越多,报告就越慢。 [...]在BI工具上,如果不放置度量类型过滤器,则可能会使用户冒着“垃圾信息”的危险。从可用性的角度来看,这种设计是垃圾。 对Mark Storey-Smith的回答 非常好的方法,我永远也不会想到。 另一件事:将集装箱带入码头的车辆的每次进出都有唯一的ID,该ID向我提供其他信息,例如:车辆的预计到达,实际到达,如果是码头的船只,如果是卡车,收费站以及许多其他信息... 这是3个不同的事实表,它们必须以某种方式链接到容器事实表。 我以为航行的ID是degenerate dimension,因此它将直接进入容器事实表。因此,我的疑问是:我应该在容器事实表中添加6个不同的字段(vessel_voyage_in_key,vessel_voyage_out_key,train_voyage_in_key,train_voyage_out_key,truck_voyage_in_key,truck_voyage_out_key)还是仅动态链接到各个表的其他2个字段(voyage_in,voyage_out)? 希望我的疑问很清楚,谢谢。

1
SQL Server数据库“默认”表
当我将新数据库添加到我们的开发服务器(使用SSMS)时,它将自动创建5个表。 这些是另一个数据库中已经存在的应用程序表的副本。 我假设这是SQL Server的一些最新功能,我不知道在哪里可以将表标记为“公共”或类似的标记,因此可以自动将其添加到新数据库中。 但是我怎样才能阻止它的发生呢? 为避免混淆,该数据库未编写脚本,而是直接从SSMS GUI创建的(右键单击“数据库”>“新建数据库”) (从StackOverflow移动)

1
如何从oracle中的两个表中获取分层数据?
我有两个表table1和table2,我需要通过连接两个表进行分层输出。 表1包含三个类别CAT1,CAT2和CAT3,其中一个外键即F_ID,它是另一个表table2的主键,表2中又包含一个列,即VAL。 TABLE 1 ----------------- CAT1 CAT2 CAT3 F_ID A a aa 1 A a ab 2 A b ba 3 A b bb 4 B c ca 5 B c cb 6 B d da 7 TABLE 2 ------------------- F_ID VAL 1 4 2 6 3 4 4 1 …

1
AlwaysON从2014年迁移到2016年
我喜欢2014年的20个Listners,大约有500 DBS, 用最少的时间和精力来迁移这些文件的最佳方法是什么 我的想法是:停止访问备份数据库开始还原数据库运行还原时:在2014上删除AOG在2016上创建AOG完成 这似乎很简单,但是使用TB数据将需要一些时间。 已找到此-> 从2014年升级到2016年的AlwaysOn AG的推荐方法, 但是它确实解释了 希望有人能帮忙

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.