数据库管理员

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

1
带有索引的JSONB与hstore
在此阶段,我试图以尽可能少的假设(关于Web应用程序实际如何演变)来决定数据库设计。 第一步,了解JOINS昂贵,因此我考虑使用少量的整体表,而不是大量的规范化较小表。第二点,我对使用hstore与常规表与JSONB(具有GiST索引)之间感到困惑。 AFAIK(请随时纠正): 通常,在Postgres中,已知hstore的性能要优于其他数据类型。FOSDEM PGDAY的演示文稿有一些有趣的统计数据(在幻灯片的下半部分)。 https://wiki.postgresql.org/images/b/b4/Pg-as-nosql-pgday-fosdem-2013.pdf hstore的一个优点是快速索引(GiN或GiST)。但是,使用JSONB,GiN和GiST索引也可以应用于JSON数据。 来自第二象限专家的博客说:“这时可能值得在所有新应用程序中用jsonb替换hstore使用”(滚动到最后):http ://blog.2ndquadrant.com/postgresql-anti-patterns-unnecessary -jsonhstore-dynamic-columns / 因此,我想决定以下几点: 对于数据的主要(结构化)部分:它应该放在几个关系表中(相对较大,有很多列),还是应该是使用hstore的许多键值存储? 对于临时(用户提供的/非结构化的)数据,应该将其存储在JSON中还是将其存储在hstore中(存储在主要关系表之一中)?

1
急切的后台打印操作符对于从群集的列存储中进行此删除有用吗?
我正在测试从群集的列存储索引中删除数据。 我注意到执行计划中有一个急切的假脱机操作员: 具有以下特征: 删除6000万行 1.9使用GiB TempDB 14分钟执行时间 连续计划 1在线轴上重新绑定 估计扫描成本:364.821 如果我诱使估算器低估了,我会得到一个更快的计划,避免使用TempDB: 估计扫描成本:56.901 (这是一个估计的计划,但是注释中的数字正确。) 有趣的是,如果我通过运行以下命令刷新增量存储,则线轴会再次消失: ALTER INDEX IX_Clustered ON Fact.RecordedMetricsDetail REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON); 仅当增量存储中的页面阈值超过某个阈值时才引入假脱机。 要检查增量存储的大小,我正在运行以下查询来检查表的行内页面: SELECT SUM([in_row_used_page_count]) AS in_row_used_pages, SUM(in_row_data_page_count) AS in_row_data_pages FROM sys.[dm_db_partition_stats] as pstats JOIN sys.partitions AS p ON pstats.partition_id = p.partition_id WHERE p.[object_id] = OBJECT_ID('Fact.RecordedMetricsDetail'); 第一个计划中的假脱机迭代器是否有任何合理的好处?我必须假定它旨在提高性能,而不是用于万圣节保护,因为它的存在不一致。 …

2
在阻止的流程报告中清空阻止流程
我正在使用扩展事件来收集阻止的流程报告,并且由于某些原因,某些报告中该blocking-process节点为空。这是完整的xml: <blocked-process-report monitorLoop="383674"> <blocked-process> <process id="processa7bd5b868" taskpriority="0" logused="106108620" waitresource="KEY: 6:72057613454278656 (8a2f7bc2cd41)" waittime="25343" ownerId="1051989016" transactionname="user_transaction" lasttranstarted="2017-03-20T09:30:38.657" XDES="0x21f382d9c8" lockMode="X" schedulerid="7" kpid="15316" status="suspended" spid="252" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2017-03-20T09:39:15.853" lastbatchcompleted="2017-03-20T09:39:15.850" lastattention="1900-01-01T00:00:00.850" clientapp="Microsoft Dynamics AX" hostname="***" hostpid="1348" loginname="***" isolationlevel="read committed (2)" xactid="1051989016" currentdb="6" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056"> <executionStack> <frame line="1" stmtstart="40" sqlhandle="0x02000000f7def225b0edaecd8744b453ce09bdcff9b291f50000000000000000000000000000000000000000" /> <frame line="1" …

2
将索引视图用于聚合-太好了以至于无法实现?
我们有一个数据仓库,它的记录数很大(10-20百万行),并且经常运行查询来对某些日期之间的记录进行计数,或者对带有某些标志的记录进行计数,例如 SELECT f.IsFoo, COUNT(*) AS WidgetCount FROM Widgets AS w JOIN Flags AS f ON f.FlagId = w.FlagId WHERE w.Date >= @startDate GROUP BY f.IsFoo 性能并不是很糟糕,但可能会相对缓慢(在冷缓存中可能为10秒)。 最近,我发现我可以GROUP BY在索引视图中使用,因此尝试了类似于以下内容的操作 CREATE VIEW TestView WITH SCHEMABINDING AS SELECT Date, FlagId, COUNT_BIG(*) AS WidgetCount FROM Widgets GROUP BY Date, FlagId; GO CREATE UNIQUE CLUSTERED …

2
如何处理由于范围类型完全相等而导致的错误查询计划?
我正在执行更新,其中我需要对tstzrange变量进行完全相等的处理。约100万行被修改,查询耗时约13分钟。的结果EXPLAIN ANALYZE可以在此处看到,实际结果与查询计划者估算的结果有很大不同。问题在于索引扫描开启t_range期望返回一行。 这似乎与以下事实有关:范围类型的统计信息与其他类型的统计信息存储方式不同。综观pg_stats为列图,n_distinct是-1和其它字段(例如most_common_vals,most_common_freqs)是空的。 但是,必须在t_range某处存储统计信息。一个非常相似的更新,其中我在t_range上使用“内”而不是完全相等,需要大约4分钟的时间来执行,并且使用完全不同的查询计划(请参阅此处)。第二个查询计划对我来说很有意义,因为将使用临时表中的每一行以及历史记录表的大部分。更重要的是,查询计划人员为上的过滤器预测了大约正确的行数t_range。 的分布t_range有点不寻常。我正在使用此表存储另一个表的历史状态,并且对另一个表的更改会在大型转储中一次全部发生,因此没有许多不同的值t_range。以下是与的每个唯一值相对应的计数t_range: t_range | count -------------------------------------------------------------------+--------- ["2014-06-12 20:58:21.447478+00","2014-06-27 07:00:00+00") | 994676 ["2014-06-12 20:58:21.447478+00","2014-08-01 01:22:14.621887+00") | 36791 ["2014-06-27 07:00:00+00","2014-08-01 07:00:01+00") | 1000403 ["2014-06-27 07:00:00+00",infinity) | 36791 ["2014-08-01 07:00:01+00",infinity) | 999753 t_range以上不同的计数已经完成,因此基数约为3M(其中1M会受到任一更新查询的影响)。 为什么查询1的性能比查询2差得多?就我而言,查询2是一个很好的替代品,但是如果确实需要精确的范围相等性,我如何才能使Postgres使用更智能的查询计划? 带索引的表定义(删除不相关的列): Column | Type | Modifiers ---------------------+-----------+------------------------------------------------------------------------------ history_id | integer | not null default nextval('gtfs_stop_times_history_history_id_seq'::regclass) t_range …

1
sys.stats_columns是否正确?
假设我有一个Foo带有列的表ID1, ID2和一个over定义的复合主键ID2, ID1。(我目前正在使用System Center产品,该产品具有以这种方式定义的多个表,并且主键列以与表定义中出现的相反顺序列出。) CREATE TABLE dbo.Foo( ID1 int NOT NULL, ID2 int NOT NULL, CONSTRAINT [PK_Foo] PRIMARY KEY CLUSTERED (ID2, ID1) ); GO -- Add a row and update stats so that histogram isn't empty INSERT INTO Foo (ID1, ID2) VALUES (1,2); UPDATE STATISTICS dbo.Foo; 中的key_ordinal列以sys.index_columns在复合主键中声明的顺序显示索引列: SELECT t.name, i.name, …


4
检查两个表在PostgreSQL中是否具有相同的内容
已经在Stack Overflow上提出了此要求,但仅适用于MySQL。我正在使用PostgreSQL。不幸的是(令人惊讶的是)PostgreSQL似乎没有类似的东西CHECKSUM table。 PostgreSQL解决方案会很好,但通用解决方案会更好。我发现http://www.besttechtools.com/articles/article/sql-query-to-check-two-tables-have-identical-data,但是我不了解所使用的逻辑。 背景:我重新编写了一些数据库生成代码,因此需要检查新旧代码是否产生相同的结果。

2
为什么SELECT *比SELECT foo快很多?
考虑一个值和哈希表,如下所示: +------------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+----------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | val | char(9) | NO | | NULL | | | val_hashed | char(50) | YES | | NULL | …

9
在SQL Server中执行FIZZBUZZ测试的最有效方法是什么?
这可能并不完全是话题,但是今天天气很慢。 是否有一种更有效的方法来获得1到49的数字列表,并在其中包含单词的列FIZZ中将数字除以3 BUZZ时,将数字除以5时以及FIZZBUZZ将数字均除时由两个 3和5? 我的尝试是(注意,这将清空过程高速缓存,因此请不要在生产包装盒上运行): DBCC FREEPROCCACHE GO /*VARIANT1*/ ;WITH t AS ( SELECT RowNum = ROW_NUMBER() OVER (ORDER BY o.object_id) FROM sys.objects o ) SELECT t.RowNum , CASE WHEN ((t.RowNum % 3) + (t.RowNum % 5)) = 0 THEN 'FIZZBUZZ' ELSE CASE WHEN t.RowNum % 3 = 0 THEN …
28 sql-server 

3
选择行,其中列包含多个记录中的相同数据
我有一个表,其中有一个名为的列article_title。假设表格名称为articles。我需要找出多个记录中article_title数据相同的记录。 这是我得到的: select a.* from articles a where a.article_title = (select article_title from articles where article_title = a.article_title AND a.id <> articles.id)

8
如何在数据库中查询空表
由于有些“开发人员”,我们在系统上进行了工作,因此空表存在问题。我们发现,在将数据转移到云的过程中,复制了几个表,但是没有复制其中的数据。 我想对系统表运行查询以查找哪些用户表为空。我们正在使用MS SQL 2008 R2。 谢谢您的帮助。

2
创建索引与更改表添加索引-MySQLism还是SQL Standard?
刚遇到一个奇怪的问题,根据我创建索引的方式,需要一个索引名称。 http://dev.mysql.com/doc/refman/5.5/zh-CN/create-index.html http://dev.mysql.com/doc/refman/5.5/en/alter-table.html CREATE INDEX `random_name` ON `my_table` (`my_column`); # Requires an index name ALTER TABLE `my_table` ADD INDEX (`my_column`); # Does not require an index name 在我看来,CREATE INDEX调用不应使索引名称成为必需。我想知道这是MySQLism还是SQL标准?

1
将所有列记录转换为小写
我正在使用PostgreSQL 9.1,并且我的用户表带有一login列。 登录名区分大小写,例如Bob,MikE和john。我想将所有这些记录转换为小写。我怎样才能做到这一点?

2
为什么在使用UNPIVOT时SQL Server要求数据类型长度相同?
将UNPIVOT功能应用于未规范化的数据时,SQL Server要求数据类型和长度相同。我知道为什么数据类型必须相同,但是为什么UNPIVOT要求长度相同? 假设我有以下示例数据需要取消透视: CREATE TABLE People ( PersonId int, Firstname varchar(50), Lastname varchar(25) ) INSERT INTO People VALUES (1, 'Jim', 'Smith'); INSERT INTO People VALUES (2, 'Jane', 'Jones'); INSERT INTO People VALUES (3, 'Bob', 'Unicorn'); 如果我尝试取消Firstname和的Lastname列,则类似于: select PersonId, ColumnName, Value from People unpivot ( Value FOR ColumnName in (FirstName, LastName) …

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.