数据库管理员

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

1
为什么我的PostgreSQL ORDER BY不区分大小写?
我在Debian上运行了Postgres 9.4.4,并且得到以下ORDER BY行为: veure_test=# show LC_COLLATE; lc_collate ------------- en_US.UTF-8 (1 row) veure_test=# SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' ') ORDER BY 1; regexp_split_to_table ----------------------- a A b c Capacitor CD d D (8 rows) 和uname -a: Linux ---- 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1 x86_64 GNU/Linux 但是,在使用Postgres …

20
如何进入一个丑陋的数据库?
我敢肯定你们中的许多人/正在处理一个丑陋的数据库。您知道,该数据库根本没有进行标准化,您必须在其中进行大量痛苦的查询才能获得最琐碎的数据,该数据库正在生产中并且您无法进行任何更改...您知道, “那个”。 我的问题是,您如何处理? 您是否尝试建立新数据库? 你放弃,让它一个人呆着吗? 您能提供什么建议?

3
SQL Server将A <> B拆分为A <B或A> B,如果B是不确定的,则会产生奇怪的结果
我们在SQL Server中遇到了一个有趣的问题。考虑以下repro示例: CREATE TABLE #test (s_guid uniqueidentifier PRIMARY KEY); INSERT INTO #test (s_guid) VALUES ('7E28EFF8-A80A-45E4-BFE0-C13989D69618'); SELECT s_guid FROM #test WHERE s_guid = '7E28EFF8-A80A-45E4-BFE0-C13989D69618' AND s_guid &lt;&gt; NEWID(); DROP TABLE #test; 小提琴 请暂时忘记这种s_guid &lt;&gt; NEWID()情况似乎毫无用处-这只是一个最小的复制示例。由于NEWID()匹配某个给定常数的可能性非常小,因此每次都应将其评估为TRUE。 但事实并非如此。运行此查询通常返回1行,但有时(非常频繁,在10中超过1次)返回0行。我已经在系统上使用SQL Server 2008对其进行了复制,您可以使用上面链接的小提琴(SQL Server 2014)在线对其进行复制。 查看执行计划可以发现查询分析器显然将条件分为s_guid &lt; NEWID() OR s_guid &gt; NEWID(): ...这完全解释了为什么有时会失败(如果第一个生成的ID小于给定ID,而第二个ID大于给定ID)。 即使其中一个表达式不是确定性的,也允许SQL Server将其评估A &lt;&gt; …

1
访问相同的LOB数据时逻辑读取不同
这是三个读取相同数据,但报告逻辑读取非常不同的简单测试: 设定 下面的脚本创建一个包含100个相同行的测试表,每个表包含一个xml列,其中包含足够的数据以确保其存储在行外。在我的测试数据库中,每行生成的xml的长度为20204字节。 -- Conditional drop IF OBJECT_ID(N'dbo.XMLTest', N'U') IS NOT NULL DROP TABLE dbo.XMLTest; GO -- Create test table CREATE TABLE dbo.XMLTest ( ID integer IDENTITY PRIMARY KEY, X xml NULL ); GO -- Add 100 wide xml rows DECLARE @X xml; SET @X = ( SELECT TOP (100) …

6
为什么使用“关系”一词?
用英语,我们可能会谈论鲍勃和蒂姆之间的关系。也许他们是表亲。在这种情况下,术语“关系”对我来说很有意义。 在关系数据库的上下文中,我理解该术语所指的含义,但我不理解为什么使用该术语。我认为了解为什么使用它可以帮助我更好地理解该领域,因此我想了解为什么使用它。 例如,为什么一个人被认为是“关系”?用英语来说,关系是描述两个实体如何关联的名词。它不涉及实体本身。在关系数据库的上下文中,“关系”是指实体本身。为什么? 我知道关系模型是在层次模型和网络模型(例如父级,邻居)之后出现的。但是在这些模型中,实体之间也有关系。那么为什么将此模型称为关系模型呢?是否有更具体的短语/术语?也许我们应该说这三个模型都是关系模型,但是层次模型和网络模型是特定类型的关系模型? 如果我们拥有彼此不相关的独立实体该怎么办。说,人,门和树。术语“关系”是否仍然适用? (也许这应该是多个问题。我认为答案是高度相关的-也许只有一个答案-所以我认为这是一个问题是有意义的。如果我错了,请告诉我而是创建单独的问题。) 编辑:此图对于可视化关系将不同的域相互关联起来可能很有用:

2
为什么LEN()函数严重低估了SQL Server 2014中的基数?
我有一个带有字符串列和谓词的表,该谓词检查具有一定长度的行。在SQL Server 2014中,无论我要检查的长度如何,我都会看到1行的估计。这产生了非常糟糕的计划,因为实际上有成千上万甚至上百万的行,并且SQL Server选择将此表放在嵌套循环的外侧。 对于SQL Server 2014的基数估计为1.0003,而SQL Server 2012的基数估计为31,622,是否有解释?有没有好的解决方法? 以下是问题的简短摘要: -- Create a table with 1MM rows of dummy data CREATE TABLE #customers (cust_nbr VARCHAR(10) NOT NULL) GO INSERT INTO #customers WITH (TABLOCK) (cust_nbr) SELECT TOP 1000000 CONVERT(VARCHAR(10), ROW_NUMBER() OVER (ORDER BY (SELECT NULL))) AS cust_nbr FROM master..spt_values v1 CROSS …

1
Mongodb增量备份
我承担了为MongoDB复制集设置增量备份的任务,当然,作为起点,我用Google搜索了它,但在MongoDB文档上找不到任何内容,但是我确实在Stack Overflow上发现了这个问题,这鼓励开发自己的解决方案因为没有发现Tayra非常活跃。 我阅读oplog并意识到,开发一些东西来重播日志非常容易,但是事实证明,我并不需mongorestore要这样做。 现在,我有了一个使用bash脚本的可行解决方案,这很容易,这就是我在这里询问我的逻辑是否有缺陷的原因,或者将来会困扰我的原因。 下面是我的实现方式: 完整备份程序 锁定写入辅助成员 db.fsyncLock() 拍摄快照 记录操作日志中的最后一个职位 db.oplog.rs.find().sort({$natural:-1}).limit(1).next().ts 解锁写入 db.fsyncUnlock() 增量备份程序 锁定写入辅助成员 从完整(或最新增量)备份中记录的oplog位置转储oplog: mongodump --host &lt;secondary&gt; -d local -c oplog.rs -o /mnt/mongo-test_backup/1 --query '{ "ts" : { $gt : Timestamp(1437725201, 50) } }' 记录最新操作日志位置(与完整备份相同) 解锁写入 完整备份还原过程 停止的所有实例 mongod 将快照复制到将成为主文件夹的数据目录中,但请确保排除所有快照,local*并且mongod.lock 此恢复技术称为通过破坏镜像进行重新配置 开始小学 重新配置副本集 在没有任何数据的情况下启动辅助设备,让它们执行初始同步。或从具有新local数据库的新主数据库复制数据 恢复增量备份 当我们创建增量备份时,它像这样存储它: /mnt/mongo-test_backup/1/local/oplog.rs.bson /mnt/mongo-test_backup/1/local/oplog.rs.metadata.json …
26 backup  mongodb 

2
我应该如何在Postgres中为UUID编制索引?
我是PostgreSQL的新手,而对于数据库则是新手。有没有确定的方法来索引Postgres中的UUID值?我在使用散列和使用Trie之间是分开的,除非已经有一些内置的东西可以自动使用。无论我使用什么,都将处理大量数据。 SP-GiST运算符系列“ text_ops”使用特里索引。因为UUID很长且非常不同,所以即使我只进行完全匹配搜索,这些听起来也很吸引人。 还有一个哈希选项。哈希为O(1),我当然不需要做任何比较,但是,由于UUID很长,因此恐怕从它们生成哈希值会浪费很多时间。 还是这过于依赖系统和使用细节? 在大多数情况下,我宁愿使用bigserial,但有人告诉我为此使用uuid。我们需要uuid,因为我们可能有多个使用不同数据库的服务器,因此不能保证我们将拥有唯一的bigint。我们可以为每个服务器使用不同的序列(和种子),但是它仍然不如UUID灵活。例如,如果不将ID及其引用转换到各处,就无法将数据库条目从一台服务器迁移到另一台服务器。
26 postgresql  index  uuid 

6
ON与WHERE的索引表现
我有两张桌子 @T1 TABLE ( Id INT, Date DATETIME ) @T2 TABLE ( Id INT, Date DATETIME ) 这些表在(Id,Date)上具有非聚集索引 我加入这些表 SELECT * FROM T1 AS t1 INNER JOIN T2 AS t2 ON t1.Id = t2.Id WHERE t1.Date &lt;= GETDATE() AND t2.Date &lt;= GETDATE() 这也可以写成 SELECT * FROM T1 AS t1 INNER …

4
由于“ XTP_CHECKPOINT”,数据库“ database_name”的事务日志已满
我有一个问题XTP_CHECKPOINT。 我正在使用SQL Server2014。我有一个处于简单恢复模型模式的数据库。它也在被复制。 没有公开交易。我已经跑了DBCC OPENTRAN,它返回: “没有活跃的公开交易。” 但是,每当我尝试创建或删除表或删除数据时,我都会不断收到此消息:( 我用单词替换了实际的数据库名称database_name) “由于'XTP_CHECKPOINT',数据库'database_name'的事务日志已满” 有谁知道为什么会发生这种情况,更重要的是,我如何才能阻止这种情况发生? 是的,数据库确实处于SIMPLE恢复模型模式。即,事务日志应自动截断。 顺便说一句,我处于完全恢复模式的另一个数据库做了同样的事情,开始返回同样的错误: 由于“ XTP_CHECKPOINT”,数据库“ database_name”的事务日志已满 我试图将日志增长设置更改为无限制增长,但它不允许我返回相同的错误。 除了文件组之外,我完全不需要任何XTP东西就可以重现该问题。方法如下:http : //pastebin.com/jWSiEU9U

2
用户定义函数的优化问题
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 4年前。 我有一个问题,为什么SQL Server决定为表中的每个值调用用户定义的函数,即使应该只提取一行。实际的SQL复杂得多,但是我能够将问题减少到这个程度: select S.GROUPCODE, H.ORDERCATEGORY from ORDERLINE L join ORDERHDR H on H.ORDERID = L.ORDERID join PRODUCT P on P.PRODUCT = L.PRODUCT cross apply dbo.GetGroupCode (P.FACTORY) S where L.ORDERNUMBER = 'XXX/YYY-123456' and L.RMPHASE = '0' and L.ORDERLINE = '01' 对于此查询,SQL Server决定为PRODUCT表中存在的每个单个值调用GetGroupCode函数,即使从ORDERLINE返回的估计行数和实际行数为1(这是主键): 计划浏览器中的同一计划显示行数: …

4
何时使用CDC跟踪历史记录?
SQL Server更改数据捕获是一项功能,可从SQL Server事务日志中读取历史数据并将其存储在特殊表中。 然后,通过使用特殊的表值函数(TVF),它允许用户查询此数据,从而有可能获得特定表上的所有更改,或者仅获得特定时间内由更改导致的净更改。 CDC具有一定优势 可以将其配置为仅跟踪某些表或列。 它能够在一定程度上处理模型更改。 它不会像触发器那样严重影响性能,因为它可以与事务日志一起使用。 它很容易启用/禁用,并且不需要在表上跟踪其他列。 它还有一些缺点: 历史数据的数量可以快速变得巨大。 您无法跟踪更改的对象(至少不能删除)。 由于历史数据是基于事务日志的,因此需要花费一些时间来追赶。 它取决于SQL Server代理。如果代理未运行或崩溃,则不会跟踪任何历史记录。 我已经阅读了很多有关CDC的文章,虽然我现在知道如何使用它,但是我仍然不确定它是否适合我。 CDC对于哪些任务/方案是正确的工具?(例如,是否允许用户将数据对象还原到某个时间点?审核?显示数据的完整历史记录?) 您什么时候不应该使用CDC,而应该使用基于触发器的自定义解决方案? 是否可以在运营数据库中使用CDC并在运营应用程序中使用CDC数据?(例如,将其显示给最终用户)还是这显然是滥用此功能? 我通常听到CDC是一种审核工具,但是这不是SQL Server Audit的目的吗?它们是否都是用于同一任务的不同工具?还是CDC可以用于其他用途? 我目前的情况是要求我构建一个可靠的数据框架,该框架应该作为将来多个应用程序的基础。确切的要求是模糊的,但是一个要求是它应该能够跟踪数据历史记录,并将旧条目以及其他表中的所有相关数据还原。我现在正在评估CDC作为一种选择,但是不确定是否要这样做,因为我找不到真正推荐的用例。 虽然我很欣赏针对我的特定情况的建议,但是答案应该提供有关何时或何时不使用Change Data Capture的一般建议。



2
当表引用自身时,如何编写查找所有循环引用的查询?
我有以下架构(名称已更改),无法更改: CREATE TABLE MyTable ( Id INT NOT NULL PRIMARY KEY, ParentId INT NOT NULL ); ALTER TABLE MyTable ADD FOREIGN KEY (ParentId) REFERENCES MyTable(Id); 也就是说,每个记录都是另一个记录的子级。如果一条记录ParentId等于它的Id,则该记录被视为根节点。 我想运行查询,将找到所有循环引用。例如,与数据 INSERT INTO MyTable (Id, ParentId) VALUES (0, 0), (1, 0), (2, 4), (3, 2), (4, 3); 查询应返回 Id | Cycle 2 | 2 …

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.