数据库管理员

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

7
通过将街道地址分成多个单独的列可以解决哪些问题?
我们有一个团队为软件开发人员设计表格和关系。在我们的组织中,他们对执行3NF标准化非常严格-坦白地说,鉴于我们的组织规模以及需求或客户随时间的变化,我同意。我对他们的设计决定背后的原因只有一个不清楚的地方:地址。 虽然这主要针对美国的地址,但我认为这可以适用于任何这样做的国家。地址的每个部分在地址表中都有自己的列。例如,以这个肮脏的美国地址为例: Attn: Jane Doe 485 1/2 N Smith St SW, APT 300B Chicago, IL 11111-2222 它会像这样在数据库中拆分: 街道号:485 街道分数:1/2 街道定向:N(北) 街道名称:史密斯 街道类型:ST(街道) 街后:SW(西南) 城市:芝加哥 州:IL(伊利诺伊州) 邮政编码:11111 邮政编码:2222 国家(假设为美国) 注意:Jane Doe 邮政信箱:NULL 居住类型:APT(公寓) 居住人数:300B 并且还会有其他几列与乡村路线和合同路线相关。此外,我们的特定应用程序可能会包含一些国际地址。数据建模人员表示,他们将添加特定于国际地址的列,即通常的第1行,第2行字段。 起初我以为这太过分了。反复进行在线研究是指使用地址行1、2、3和可能的4,然后划分城市,地区和邮政编码。对于这种粒度很有用的新应用程序,我们确实有一个用例。我们必须验证用户没有创建重复业务,并且检查地址是验证之一。我们可以使其与地址线1和2一起使用,但这会更加困难。 对于我们的特定应用程序,我们需要为企业和个人存储多种地址(实体地址,邮件地址,运输地址等)。我们可能需要生成可打印的套用信函,但到目前为止尚未讨论该要求。 我们组织中的应用程序还需要支持其他一些功能: 审核(带有完整的历史记录表) 打印邮件标签 生成打印表格 报告(针对国家和地区政府) 虽然我们的应用程序可能无法像其他应用程序那样做所有事情,但是将地址拆分为多个组件是我工作的企业标准。无论我们的应用程序是否将从中受益,我们都被迫这样做。 半相关的StackOverflow问题:一个好的地址解析器在哪里被关闭,但是它说明了解析地址有多困难。 为了让我更好地了解他们的设计决策,并向我们的客户推销该想法... 将街道地址分为几列可以解决哪些问题? 对于实施了这样的系统的任何人,如果他们遇到了问题,就会获得加分。

5
两个日期列的SARGable WHERE子句
对于我来说,我有一个关于可保存性的有趣问题。在这种情况下,它是关于两个日期列之间的差异使用谓词。设置如下: USE [tempdb] SET NOCOUNT ON IF OBJECT_ID('tempdb..#sargme') IS NOT NULL BEGIN DROP TABLE #sargme END SELECT TOP 1000 IDENTITY (BIGINT, 1,1) AS ID, CAST(DATEADD(DAY, [m].[severity] * -1, GETDATE()) AS DATE) AS [DateCol1], CAST(DATEADD(DAY, [m].[severity], GETDATE()) AS DATE) AS [DateCol2] INTO #sargme FROM sys.[messages] AS [m] ALTER TABLE [#sargme] ADD …

4
为什么在每晚备份的简单恢复模式下事务日志会继续增长
在立即将其标记为重复之前,我已阅读Mike Walsh的“ 为什么事务日志保持增长或空间不足?,但我认为这无法解决我的情况。我浏览了十几个类似的问题,但相关的问题大多只是说“重复”并指出了麦克的问题。 详细信息:我在SQL Server 2008 R2上有一堆约500MB的数据库,全部处于简单恢复模式(不是我的选择),每晚进行完整备份,并具有约200MB的数据文件和约300MB的日志文件。日志不会立即增长到300MB,而是会在几个月后缓慢增长。至少根据sp_who2和活动监视器,它们中的任何一个都没有打开的事务。如果我右键单击数据库并选择属性,它会告诉我大约有50MB可用空间。特别是在备份之后,整个日志是否不应该免费?在简单模式下,只要没有未完成的事务,日志是否不应该免费? log_reuse_wait_descfrom sys.databases说“什么都没有”,根据上面提到的问题和答案,它说它不应该等待任何东西来重用空间。 如果我执行“ DBCC SHRINKFILE”,则日志文件会缩小到1MB,因此它愿意回收空间。我可以设置一些可以每周缩小日志并防止事情失控的事情,但是我对为什么SQL Server可以做到这一点感到困惑。 我可以理解是否有一些需要300MB记录的疯狂交易,但是我们没有做任何极端的事情,只是基本的OLTP。来自Mike的问题/答案: 简单恢复模型-通过上面的介绍,最简单的是首先讨论简单恢复模型。在此模型中,您要告诉SQL Server-可以使用事务日志文件进行崩溃和重新启动恢复(您确实没有选择。在这里查找ACID属性,应该很快就可以理解),但是一旦您没有,出于崩溃/重新启动恢复目的而不再需要它,请继续并重用日志文件。 SQL Server在简单恢复中侦听此请求,并且仅保留进行崩溃/重新启动恢复所需的信息。一旦SQL Server确定它可以恢复,因为数据已经被硬化到数据文件中(或多或少),则已硬化的数据将不再在日志中被使用,并被标记为截断-这意味着它将被重新使用。 它一直在说应该重新使用日志空间,但是随着几个月来的缓慢增长,似乎并没有。 我想念什么?是否可以阻止SQL Server将数据识别为“已强化”并释放日志? (编辑) 行动后报告-又一点知识是危险的 在发现这是一个“普遍的问题”之后,感觉就像我对7个月前发生的事情以及我所学到的希望为其他人节省一些悲痛的事情做了解释。 首先,当您查看数据库的属性时,在SSMS中看到的可用空间就是数据文件中的可用空间。您可以通过在数据库上运行以下命令来查看此文件,然后发现SSMS报告的可用空间是FileSizeMB与UsedSpaceMB之间的差异: SELECT DB.name, MF.physical_name, MF.type_desc AS FileType, MF.size * 8 / 1024 AS FileSizeMB, fileproperty(MF.name, 'SpaceUsed') * 8/ 1024 AS UsedSpaceMB, mf.name LogicalName FROM sys.master_files …

2
在SQL Server中,当在仅具有聚集索引的表上强制执行索引查找时,是否可以保证没有显式ORDER BY子句的订单?
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 4年前。 更新2014-12-18 对于主要问题“否”的压倒性回答,更有趣的回答集中在第2部分,即如何用显式解决性能难题ORDER BY。尽管我已经标记了答案,但是如果有一个性能更好的解决方案,我也不会感到惊讶。 原版的 之所以出现这个问题,是因为我可以找到的解决特定问题的唯一极其快速的解决方案,只有在没有ORDER BY子句的情况下才能起作用。以下是产生问题所需的完整T-SQL,以及我提出的解决方案(如果有问题,我正在使用SQL Server 2008 R2。) --Create Orders table IF OBJECT_ID('tempdb..#Orders') IS NOT NULL DROP TABLE #Orders CREATE TABLE #Orders ( OrderID INT NOT NULL IDENTITY(1,1) , CustID INT NOT NULL , StoreID INT NOT NULL , Amount FLOAT …
24 sql-server 

1
如果MongoDB中的插入过多,会发生什么情况?如何确保所有数据都已存储?
此问题是从“服务器故障” 迁移而来的,因为可以在数据库管理员堆栈交换中回答。 迁移 6年前。 我使用MongoDB来存储定期测量的值。每隔约100毫秒将一堆值插入为文档。它工作正常,但我担心性能问题。(我使用安全插入,似乎在PyMongo中这是默认值。) 如果每秒插入的内容多于mongod可以保存到硬盘上的内容,会发生什么情况?会发出任何警告,还是只是默默地失败? 有什么方法可以监视写负载?我发现只有db.serverStatus().writeBacksQueued在调用它时始终将其设置为false的情况。我如何测试必须插入多少数据才能填满写队列? mongostat显示锁。这是我应该担心的事情吗? insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn repl time *117 *0 *0 *0 0 2|0 0 17.4g 35.3g 3.76g 0 .:6.5% 0 0|0 0|0 124b 6k 2 SLV …
24 mongodb 

2
提高大型PostgresSQL表中COUNT / GROUP-BY的性能?
我正在运行PostgresSQL 9.2,并具有12列的关系,大约有6,700,000行。它包含3D空间中的节点,每个节点都引用一个用户(创建它的用户)。为了查询哪个用户创建了多少个节点,我执行以下操作(添加explain analyze以获得更多信息): EXPLAIN ANALYZE SELECT user_id, count(user_id) FROM treenode WHERE project_id=1 GROUP BY user_id; QUERY PLAN --------------------------------------------------------------------------------------------------------------------------- HashAggregate (cost=253668.70..253669.07 rows=37 width=8) (actual time=1747.620..1747.623 rows=38 loops=1) -> Seq Scan on treenode (cost=0.00..220278.79 rows=6677983 width=8) (actual time=0.019..886.803 rows=6677983 loops=1) Filter: (project_id = 1) Total runtime: 1747.653 ms 如您所见,这大约需要1.7秒。考虑到数据量,这还算不错,但是我想知道是否可以改进。我试图在用户列上添加一个BTree索引,但这没有任何帮助。 您还有其他建议吗? 为了完整起见,这是完整的表定义及其所有索引(没有外键约束,引用和触发器): Column …

5
识别未使用的存储过程
明年,我正在帮助清理几个SQL Server环境。 我们大约有10,000个存储过程,并且估计只有大约1000个存储过程是定期使用的,而另外200个左右的存储过程很少使用,这意味着我们有很多工作要做。 由于我们有多个部门和团队可以访问这些数据库和过程,因此我们并不总是调用这些过程的人,这意味着我们必须确定正在调用的过程。最重要的是,我们希望在几个月而不是几天内确定这一点(这消除了一些可能性)。 一种解决方法是使用SQL Server Profiler和跟踪正在调用的程序,并将它们与我们拥有的程序列表进行比较,同时标记是否使用了这些程序。从那时起,我们可以将程序转移到其他模式,以防部门尖叫。 Profiler在这里使用最有效的方法吗?和/或你们有没有做过类似的事情并找到了另一种方法/更好的方法呢?



4
使用row_to_json创建JSON时将名称设置为属性
仅对某些列f1, f2, f3...使用row_to_json函数时,是否可以重命名默认名称? 我可以 row_to_json(customers) 返回 {"id_customer":2,"first_name":"bla","last_name":"second_bla"} 但是,如果我只想要没有的名称id_customer,则必须使用 row_to_json(row(first_name, last_name)) 然后我得到 {"f1":"bla","f2":"second_bla"} 我想使用默认列名或我自己的列名来获得此结果。我知道我可以创建自己的复合类型并使用 row_to_json(row(first_name, last_name))::my_custom_type 但是在不创建该类型的情况下在查询中是否可以正确执行呢?
24 postgresql 

3
持久计算列上的索引需要键查找才能获取计算表达式中的列
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 6年前。 我在表上有一个持久的计算列,该表只是由串联的列组成,例如 CREATE TABLE dbo.T ( ID INT IDENTITY(1, 1) NOT NULL CONSTRAINT PK_T_ID PRIMARY KEY, A VARCHAR(20) NOT NULL, B VARCHAR(20) NOT NULL, C VARCHAR(20) NOT NULL, D DATE NULL, E VARCHAR(20) NULL, Comp AS A + '-' + B + '-' …


6
更改实时生产数据库上的表
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 7年前。 大多数“流行的”(MySQL,Postgres ...)数据库系统如何处理更改实时生产数据库上的表(如添加,删除或更改列的类型)? 我知道正确的方法是备份所有计划停机时间,然后进行更改。 但是...当前的数据库系统是否支持“在线”执行这些操作而不停止任何操作?(也许只是延迟引用刚被更改/删除的列的查询) 当我ALTER TABLE...在实时运行的数据库上进行操作时,会发生什么?发生这种情况时,一切都会停止吗?数据会损坏吗?等等 同样,我主要指的是Postgres或MySQL,因为它们是我遇到的。 (是的,是的,我必须在做“正确的方式”之前做任何事情,备份事情,安排例行工作……。但是我只是想知道是否有可能做这样的事情,而事情“很快又脏”或是否有任何数据库系统实际上支持“快速,活动和脏”模式更改) 有人刚才建议的在线模式修改为MySQL从Facebook脚本(有教程这里和源在这里)......似乎是一个很好的方式来自动执行了一套“哈克”的方式来做到这一点...有没有人用它在类似于生产吗?

7
从选择子查询中获取多个列
SELECT *, p.name AS name, p.image, p.price, ( SELECT ps.price FROM product_special ps WHERE p.id = ps.id AND ps.date < NOW() ORDER BY ps.priority ASC, LIMIT 1 ) AS special_price, ( SELECT ps.date FROM product_special ps WHERE p.id = ps.id AND ps.date < NOW() ORDER BY ps.priority ASC, LIMIT 1 …
24 subquery 

3
为什么“ SELECT @@ IDENTITY”返回一个小数?
我正在使用Dapper从ASP.NET MVC 3(.NET 4.0)应用程序对SQL Server 2008 R2 Express实例执行以下查询。 INSERT INTO Customers ( Type, Name, Address, ContactName, ContactNumber, ContactEmail, Supplier) VALUES ( @Type, @Name, @Address, @ContactName, @ContactNumber, @ContactEmail, @Supplier) SELECT @@IDENTITY 的调用connection.Query<int>(sql, ...)引发了无效的强制转换异常。我已经调试了它,就在Dapper调用return GetValue的时候SqlDataReader。 返回类型GetValue为Object,在调试器中检查它的显示类型是装箱的十进制数。 如果将select更改为SELECT CAST(@@IDENTITY as int),则GetValue的返回是装箱的int,并且不会引发异常。 Id列绝对是int类型;为什么要SELECT @@IDENTITY返回小数? 一些其他信息: 该数据库是全新的。 客户表是我添加到其中的唯一对象。数据库中没有其他(用户)表,视图,触发器或存储过程。 数据库中有10行,Id为1,2,3,4,5,6,7,8,9,10(即,该列未超出int的限制)。 我的表定义是 CREATE TABLE [dbo].[Customers]( [Id] [int] …

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.