数据库管理员

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

2
信任哪个?
我们正在解决与供应商长期存在的问题。他们的软件倾向于冻结并每周停止一次或两次工作,从而严重干扰我们的运营。尽管我们向他们发送了许多GB的日志和数据库备份,但他们无法确定原因。最近,他们开始暗示问题出在我们的维护上,而不是软件方面(尽管没有长期运行的查询,CPU / RAM / IO压力,甚至在出现问题时出现死锁)。特别是他们说我们的索引是一个问题。 尽管我认为MS不赞成使用该工具,但他们最喜欢使用的工具是DBCC showcontig。他们特别着迷于扫描密度和范围碎片。为了消除借口,我建立了一些积极的夜间维护措施,以小于90%的扫描密度或大于10%的碎片重建索引。这多少使它们脱离了扫描密度列,但是它们仍然专注于范围碎片。DBCC showcontig即使在几个小时之前重建的索引上也显示出高度碎片。下面是dbcc_showcontig和sys.dm_db_index_physical_stats的结果,它们指向的表是“可能的问题”。 DBCC SHOWCONTIG 已扫描的页面................................:1222108 扫描范围.....................:152964 范围开关.....................:180904 平均 每个范围的页数...........................:8.0 扫描密度[最佳计数:实际计数] ..:84.44%[152764:180905] 逻辑扫描碎片..................:3.24% 扩展扫描碎片....................:35.97% 平均 每页可用字节数.....................:692.5 平均 页面密度(完整).....................:91.44% sys.dm_db_index_physical_stats index_type_desc alloc_unit_type_desc Avg_fragmentation_in_percent page_count CLUSTERED INDEX IN_ROW_DATA 3.236803129 1222070 NONCLUSTERED INDEX IN_ROW_DATA 0.680074642 48230 NONCLUSTERED INDEX IN_ROW_DATA 0.093237195 48264 NONCLUSTERED INDEX IN_ROW_DATA 0.03315856 48253 NONCLUSTERED INDEX …

2
具有更多列的单个表与具有更少列的多个表
对于社交网站,哪种数据库设计更好?具有更多列和更少行的单个表,还是具有更少列但更多行的多个表? 例如:用户可以在自己的墙上或群组中发布更新。 我可以想到的两种数据库设计是: 设计1 用户帖子 ID 用户身份 发布 约会时间 UserGroupPost: ID groupId 用户身份 发布 约会时间 潜在问题:可能需要加入,这可能(将来)成为缓慢的查询。 设计2 帖子: ID 用户身份 groupId 发布 日期时间(如果用户在墙上张贴,则groupid将为null) 潜在问题:循环遍历大型数据集可能需要花费很长时间。 数据增加时如何获得更好的性能?还有其他(更好)的方法吗?

3
意外更改数据库名称(SQL Server 2008)
还没有发生在我身上。但是我在想这个。 我在搞乱我的培训环境,错误地单击了数据库名称,然后触摸了字母A。 假设我按下Enter键。现在数据库称为A,我不记得原来的名字了。CTRL + Z不起作用。 在生产环境中,在这种情况下该怎么办? 我知道这不会发生,因为数据库未设置为“单用户”。但是,如果发生这种情况。该怎么办?为了论证,让我们说这是一个没有人使用的数据库。

3
如何在短时间内将大量记录插入数据库?
我必须使用最快的方法一次将一堆记录(500,000)插入数据库。我尝试一次插入1,700条记录,但花了二十分钟!!我正在使用SQL-SERVER和C#。 尽管下表对快速插入技术无济于事,但我还是决定将其链接起来,以便您更好地了解我需要插入的字段数(将其复制大约500K)。
8 sql-server  c# 

3
当使用sp_MSForEachDB遍历数据库时,IF语句不跳过TempDB
[SQL Server 2012 SP2 EE] 为什么以下脚本给我一个与tempdb有关的错误? exec sp_MSForEachDB ' IF ( (select database_id from sys.databases where name = ''?'') > 4) BEGIN ALTER AUTHORIZATION ON DATABASE::? TO [sa]; ALTER DATABASE [?] SET RECOVERY SIMPLE; END' 这是我得到的错误: Msg 5058, Level 16, State 1, Line 5 Option 'RECOVERY' cannot be set in …

2
查询以根据时间重叠确定开始和结束日期
给定以下数据: id | user_id | started | closed | dead ------------------------------------------------------------------------------------------- 7714 | 238846 | 2015-01-27 15:14:50 | 2015-02-02 14:14:13 | NULL 7882 | 238846 | 2015-01-28 13:25:58 | NULL | 2015-05-15 12:16:07 13190 | 259140 | 2015-03-17 10:11:44 | NULL | 2015-03-18 07:31:57 13192 | 259140 | 2015-03-17 10:12:17 …
8 mysql 

1
相似度函数的最佳索引
因此,我的这张表有620万条记录,而且我必须对该列执行相似的搜索查询。查询可以是: SELECT "lca_test".* FROM "lca_test" WHERE (similarity(job_title, 'sales executive') > 0.6) AND worksite_city = 'los angeles' ORDER BY salary ASC LIMIT 50 OFFSET 0 可以在where中添加更多条件(年份= X,worksite_state = N,status =“已认证”,visa_class = Z)。 运行其中一些查询可能会花费很长时间,超过30秒。有时超过一分钟。 EXPLAIN ANALYZE 前面提到的查询给了我这个: Limit (cost=0.43..42523.04 rows=50 width=254) (actual time=9070.268..33487.734 rows=2 loops=1) -> Index Scan using index_lca_test_on_salary on lca_test …

1
MySQL在数字列中加载NULL
MySQL 5.6.23,InnoDB 我正在使用LOAD DATA INFILEcommnd 从字符分隔的文本文件中加载表,我希望每个带有a的字段(在此设置中\N为NULL字符)都将a放置NULL在表中。一些数字类型具有此行为,而另一些数字类型则放置0。我正在使用FIELDS TERMINATED BY,某些列确实可以正确获取NULL值,因此它不是固定行格式的问题。 这些是我在测试时观察到的类型: INT插入NULLs DECIMAL(x,0)插入NULLs DECIMAL(x,y)插入0.0s FLOAT插入0s DOUBLE(x,y)插入0.0s DOUBLE插入0s 所有有问题的列都用定义DEFAULT NULL。我知道各种函数都可以将这些0s转换为NULLs。问题是是否存在可以处理小数精度并且也将NULL在加载时插入s 的数据类型。 此外,我看到了一大堆与误解字符串,空字符串和null值有关的问题。(示例 示例 示例)这不是问题,因为NULLs存在,并且在我将其重新定义为DECIMAL(x,0)时正确地装入了同一列,然后在定义为DECIMAL(x,3)时不正确。

1
如何终止等待IO_COMPLETION的暂停的SQL Server事务?
我们有一个已运行5个小时以上的交易。我们的磁盘空间不足。会话已被终止,但仍在等待IO_COMPLETION。实际上,wait_type刚刚更改为PAGEIOLATCH_EX。如何终止已暂停的SQL Server事务?我不担心丢失数据,因为所有数据都可以重新填充。 session_id: 54 STATUS: suspended blocked by: 0 wait_type: PAGEIOLATCH_EX Elapsed Time (in Sec): 19750.420000 open_transaction_count: 2

2
有关基础设计,首次数据库设计的建议
我正在学习成为一名Java开发人员的课程。 该课程涉及使用数据库,但是不幸的是,我们从未真正设计任何数据库。 大多数时候,我们会获得预制数据库,并且必须在其上实现代码以插入,更新,读取或删除数据。 但是,当我进行最后的测试时,很可能我会做一些涉及数据库的事情,因此我想尝试设计一些较小的项目以摆脱设计的束缚,因为我注意到良好的数据库设计在编写代码以使用它。 我希望这里允许这些类型的问题,并且不会太广泛。 这是东西简单做了一个小设计,我clubs和members同addresses和phonenumbers。 将有多个俱乐部。 每个俱乐部将有多个成员(明显) 成员不能成为多个俱乐部的成员 成员可以具有多个电话号码和电子邮件地址 会员只能有一个地址 一个地址可以属于不同的成员(夫妇或兄弟姐妹) 我最大的困惑: 如果我想在其中添加Club描述所有者(也将是成员)的列,那么最好是在没有两次列出相同成员的情况下的最佳方法? 我应该将所有表格放在id的自动增量上,还是一个坏主意?(好处/缺点?) 如果在“外键”选项卡中添加外键,这些外键会自动对应于正确的表吗?还是也必须将它们添加到列中?(见图2) 而我在所有可能noobiest问题...我是否把的外键phonenumber并email在各自的表链接到一个PERSON_ID或者我应该把phoneNumber的和电子邮件标识的在人的表? (我对图片中的语言不是英语表示歉意,希望这不是太大的问题)

1
Postgresql:将对象聚合到一个(json)数组中(子查询问题)
标题含糊不清,我很抱歉,但是我根本不知道用正确的词来形容。 我有此查询将一堆列转换为可以正常工作的对象: SELECT row_to_json(t) FROM ( SELECT type, properties, geometry FROM "bgbCargoMinardJSON" ) t 但是,我想将属于特定类别的对象归为一个数组。此类别由我的表中名为“ cargoProductId”的第四列定义。该数组应具有“ cargoProductId”的值作为键。所以: "961":[ {"type":"Feature",.... {"type":"Feature",.... {"type":"Feature",.... ], "962":[ ..... ] 所以在过去的大约1 1/2个小时里,我一直在为此苦苦挣扎。我真的不知道该怎么做。这就是我现在所拥有的: SELECT array_agg(row_to_json(t)) FROM ( SELECT type, properties, geometry FROM "bgbCargoMinardJSON" ) t) FROM "bgbCargoMinardJSON" GROUP BY "carProductId"


1
在SQL Server中合并行大小溢出-“无法创建行大小。”
我尝试将数据合并到的目标表有〜660列。合并的代码: MERGE TBL_BM_HSD_SUBJECT_AN_1 AS targetTable USING ( SELECT * FROM TBL_BM_HSD_SUBJECT_AN_1_STAGING WHERE [ibi_bulk_id] in (20150520141627106) and id in(101659113) ) AS sourceTable ON (...) WHEN MATCHED AND ((targetTable.[sampletime] <= sourceTable.[sampletime])) THEN UPDATE SET ... WHEN NOT MATCHED THEN INSERT (...) VALUES (...) 我第一次运行此程序(即,当表为空时)成功,并插入了一行。 我第二次使用相同的数据集运行此错误,但返回错误: 无法创建大小为8410的行,该行大于允许的最大行大小为8060。 为什么第二次尝试合并已经插入的同一行却导致错误。如果该行超过最大行大小,则可能无法将其插入到第一位。 因此,我尝试了两件事(并成功!): 从合并语句中删除“未匹配时”部分 在我尝试合并的同一行上运行更新语句 为什么使用合并更新不会成功,而插入却成功,直接更新也不会成功? 更新: …

3
加快Postgres部分索引的创建
我正在尝试在Postgres 9.4中为大型(1.2TB)静态表创建部分索引。 我的数据是完全静态的,因此我可以插入所有数据,然后创建所有索引。 在这个1.2TB的表中,我有一列名为run_id,它清楚地划分了数据。通过创建覆盖run_ids 范围的索引,我们获得了出色的性能。这是一个例子: CREATE INDEX perception_run_frame_idx_run_266_thru_270 ON run.perception (run_id, frame) WHERE run_id >= 266 AND run_id <= 270; 这些部分索引为我们提供了所需的查询速度。不幸的是,每个部分索引的创建大约需要70分钟。 看来我们受CPU限制(top正在显示该进程的100%)。 我有什么办法可以加快创建部分索引的速度? 系统规格: 18核至强 192GB内存 RAID中的12个SSD 自动真空关闭 maintenance_work_mem:64GB(太高了吗?) 表规格: 大小:1.26 TB 行数:105.37亿 典型索引大小:3.2GB(存在〜.5GB的差异) 表定义: CREATE TABLE run.perception( id bigint NOT NULL, run_id bigint NOT NULL, frame bigint NOT NULL, …

2
查找以编程方式联接表所需的所有联接
给定一个SourceTable和TargetTable,我想以编程方式创建一个具有所有所需联接的字符串。 简而言之,我试图找到一种创建这样的字符串的方法: FROM SourceTable t JOIN IntermediateTable t1 on t1.keycolumn = t.keycolumn JOIN TargetTable t2 on t2.keycolumn = t1.keycolumn 我有一个查询,该查询返回给定表的所有外键,但是在尝试以递归方式遍历所有这些以找到最佳联接路径并制成字符串时遇到了局限性。 SELECT p.name AS ParentTable ,pc.name AS ParentColumn ,r.name AS ChildTable ,rc.name AS ChildColumn FROM sys.foreign_key_columns fk JOIN sys.columns pc ON pc.object_id = fk.parent_object_id AND pc.column_id = fk.parent_column_id JOIN sys.columns rc …

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.