数据库管理员

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

7
mysqldump是否可以转储重现查询所需的数据库子集?
背景 我想提供重现select查询所需的数据库子集。我的目标是使我的计算工作流具有可重现性(就像在可重现的研究中一样)。 题 有没有一种方法可以将这个select语句合并到一个脚本中,该脚本将查询到的数据转储到新数据库中,以便可以将数据库安装在新的mysql服务器上,并且该语句可以与新数据库一起使用。除了已在查询中使用的记录以外,新数据库不应包含其他记录。 更新: 为澄清起见,我对查询结果的csv转储不感兴趣。我需要做的是转储数据库子集,以便可以将其安装在另一台计算机上,然后查询本身可以重现(并且可以针对同一数据集进行修改)。 例 例如,我的分析可能查询需要从多个(在此示例中为3个)表中进行记录的数据子集: select table1.id, table1.level, table2.name, table2.level from table1 join table2 on table1.id = table2.table1_id join table3 on table3.id = table2.table3_id where table3.name in ('fee', 'fi', 'fo', 'fum');

2
无法使用CREATE或REPLACE重命名PostgreSQL视图中的列
在PostreSQL 8.3中,我试图创建一个视图,该视图看起来就像一个现有表,但是具有不同的列名。 这有效 CREATE OR REPLACE VIEW gfam.nice_builds AS SELECT (family_tree.family_tree_id) as x, family_tree.family_tree_name, family_tree.family_tree_description FROM gfam.family_tree; 上面复制了family_tree表,但是以下尝试失败: CREATE OR REPLACE VIEW gfam.nice_builds AS SELECT (family_tree.family_tree_id) as x, family_tree.family_tree_name, family_tree.family_tree_description FROM gfam.family_tree; 错误:无法更改视图列“ family_tree_id”的名称 如何重命名列?
37 postgresql 

2
在这种情况下,为什么使用表变量的速度是#temp表的两倍?
我在这里查看的文章“ 临时表与表变量及其对SQL Server性能和SQL Server 2008的影响”能够重现与2005年类似的结果。 当仅执行10行存储过程(以下定义)时,表变量version out会执行临时表版本两次以上。 我清除了过程缓存并运行了两个存储过程10,000次,然后又重复了该过程以进行另外4次运行。以下结果(每批次的时间,以毫秒为单位) T2_Time V2_Time ----------- ----------- 8578 2718 6641 2781 6469 2813 6766 2797 6156 2719 我的问题是:表变量版本具有更好的性能的原因是什么? 我已经做了一些调查。例如,用 SELECT cntr_value from sys.dm_os_performance_counters where counter_name = 'Temp Tables Creation Rate'; 确认在这两种情况下,临时对象都是在第一次运行后按预期进行缓存,而不是针对每次调用从头开始再次创建。 类似地跟踪Auto Stats,SP:Recompile,SQL:StmtRecompile在探查事件(下图)显示,这些事件只出现一次(在第一次调用#temp表的存储过程)和其他9999个执行不提高任何这些事件。(表变量版本未获得任何这些事件) 第一次运行存储过程的开销稍大一点也不能解决总体差异,但是由于清除过程缓存并同时运行两个过程只需要花费几毫秒,因此我不相信统计信息还是重新编译可能是原因。 创建所需的数据库对象 CREATE DATABASE TESTDB_18Feb2012; GO USE TESTDB_18Feb2012; CREATE TABLE NUM ( …

1
在同一查询中具有不同条件的Postgres计数
编辑 Postgres 9.3 我正在处理具有以下架构的报告:http : //sqlfiddle.com/#!15/fd104/2 当前查询工作正常,如下所示: 基本上它是一个3表内部联接。我没有进行此查询,但是留下查询的开发人员想修改查询。如您所见,TotalApplication只计算基于的总申请量a.agent_id。您可以totalapplication在结果中看到该列。我要删除的是并将其更改totalapplication为新的两列。我想添加completedsurvey和partitalsurvey列。所以基本上这部分将成为 SELECT a.agent_id as agent_id, COUNT(a.id) as CompletedSurvey FROM forms a WHERE a.created_at >= '2015-08-01' AND a.created_at <= '2015-08-31' AND disposition = 'Completed Survey' GROUP BY a.agent_id 我刚刚添加了,AND disposition = 'Completed Survey'但是我需要另一列partialsurvey具有相同查询的列,completedsurvey唯一的区别是 AND disposition = 'Partial Survey' 和 COUNT(a.id) as PartialSurvey 但是我不知道将查询放在哪里或查询的样子,所以最终输出包含这些列 agent_id, …

2
外部应用与左连接性能
我正在使用SQL SERVER 2008 R2 我刚刚在SQL中遇到了APPLY,并且很喜欢它如何解决很多情况下的查询问题, 我使用2个左联接的许多表都得到结果,我能够获得1个外部应用。 我的本地数据库表中有少量数据,并且在部署之后,该代码应该在至少20倍大的数据上运行。 我担心对于大量数据而言,外部应用可能需要比2个左连接条件更长的时间, 任何人都可以说出Apply的工作原理,以及它如何影响非常大的数据的性能。如果可能的话,每个表的大小与n1 ^ 1或n1 ^ 2 ...成比例关系……其中n1是表中的行数1。 这是带有2个左联接的查询 select EC.*,DPD.* from Table1 eC left join ( select member_id,parent_gid,child_gid,LOB,group_gid,MAX(table2_sid) mdsid from Table2 group by member_id,parent_gid,child_gid,LOB,group_gid ) DPD2 on DPD2.parent_gid = Ec.parent_gid AND DPD2.child_gid = EC.child_gid AND DPD2.member_id = EC.member_id AND DPD2.LOB = EC.default_lob AND …

2
MySql的LAST_INSERT_ID()函数是否保证正确?
当我对具有列INSERT的表进行单行处理时,AUTO_INCREMENT我想使用该LAST_INSERT_ID()函数返回AUTO_INCREMENT为该行存储的新的'ed值。 由于许多Microsoft SQL Server的开发者和管理员毫无疑问都知道在SQL Server(等效功能SCOPE_IDENTITY和@@IDENTITY)一直没有没有问题。 我知道MySQL文档状态: 生成的ID在每个连接的服务器中维护。这意味着函数返回给定客户端的AUTO_INCREMENT值是为该客户端影响AUTO_INCREMENT列的最新语句生成的第一个值。该值不会受到其他客户端的影响,即使它们生成AUTO_INCREMENT自己的值也是如此。此行为可确保每个客户端都可以检索自己的ID,而不必担心其他客户端的活动,也不需要锁或事务。 (资源) 甚至甚至说: 从多个客户端同时使用LAST_INSERT_ID()和AUTO_INCREMENT列是完全有效的。 (资源) 是否存在任何可能导致LAST_INSERT_ID()无法返回正确值的已知风险或情况? 我在CentOS 5.5 x64和Fedora 16 x64和InnoDB引擎上使用MySQL 5.5。

1
如何在SQL Server 2017中使用SNAPSHOT_MATERIALIZATION创建视图?
SQL Server 2017有几个新的存储过程: sp_refresh_single_snapshot_view – @view_name nvarchar(261),@ rgCode int的输入参数 sp_refresh_snapshot_views – @rgCode int的输入参数 以及sys.messages中的新条目: 10149 –无法在视图'%。* ls'上创建具有SNAPSHOT_MATERIALIZATION的索引,因为视图定义包含内存优化表。 10642 –无法为'%。* ls'上的索引'%。* ls'设置SNAPSHOT_MATERIALIZATION,因为它仅适用于视图上的索引。 10643 –不能在'%。* ls'上为'%。* ls'设置SNAPSHOT_MATERIALIZATION,因为它仅适用于视图上的聚集索引。 10648 –无法为'%。* ls'上的分区索引'%。* ls'设置SNAPSHOT_MATERIALIZATION。 10649 –无法在具有SNAPSHOT_MATERIALIZATION的聚集索引'%。* ls'的'%。* ls'上创建非聚集索引'%。* ls'。 10650 –刷新快照视图要求在数据库上启用快照隔离。 3760 –无法在具有SNAPSHOT_MATERIALIZATION的视图'%。* ls'上删除索引'%。* ls'。 4524 –无法更改视图'%。* ls',因为它具有快照实现。 4525 –刷新视图之前,无法在具有快照实现的视图'%。* ls'上使用提示'%ls'。 以及新的扩展事件: 那么我们如何创建快照实现的视图呢?(显然,Microsoft尚未对此进行记录。)这是我迄今为止尝试过但仍未奏效的要点。

2
了解“位图堆扫描”和“位图索引扫描”
我将通过以下示例来解释我的误解。 我不明白基本面的Bitmap Heap Scan Node。考虑查询SELECT customerid, username FROM customers WHERE customerid < 1000 AND username <'user100';的计划是这样的: Bitmap Heap Scan on customers (cost=25.76..61.62 rows=10 width=13) (actual time=0.077..0.077 rows=2 loops=1) Recheck Cond: (((username)::text < 'user100'::text) AND (customerid < 1000)) -> BitmapAnd (cost=25.76..25.76 rows=10 width=0) (actual time=0.073..0.073 rows=0 loops=1) -> Bitmap Index Scan …
36 postgresql  index 


5
当以前快速的SQL查询开始运行缓慢时,如何查找问题的根源?
背景 我有一个针对SQL Server 2008 R2的查询,该查询联接和/或左联接约12个不同的“表”。该数据库相当大,有许多表超过5000万行和大约300个不同的表。适用于在全国设有10个仓库的大型公司。所有仓库都读取和写入数据库。所以它很大而且很忙。 我遇到的查询看起来像这样: select t1.something, t2.something, etc. from Table1 t1 inner join Table2 t2 on t1.id = t2.t1id left outer join (select * from table 3) t3 on t3.t1id = t1.t1id [etc]... where t1.something = 123 请注意,联接之一是在不相关的子查询上。 问题是从今天早上开始,在没有对系统进行任何更改(我或我的团队中的任何人都知道)的情况下,该查询通常需要运行2分钟左右,而开始需要花一个半小时才能运行-跑了。数据库的其余部分运行正常。我已经从通常运行该程序的过程中取出了此查询,并以相同的慢度在带有硬编码参数变量的SSMS中运行了该查询。 奇怪的是,当我使用不相关的子查询并将其放入临时表中,然后使用该子查询代替子查询时,查询运行良好。另外(这对我来说是最奇怪的),如果我将这段代码添加到查询的末尾,则查询运行良好: and t.name like '%' 我从这些小实验得出的结论(可能是错误的)是,放慢速度的原因是由于如何设置SQL的缓存执行计划-当查询略有不同时,它必须创建一个新的执行计划。 我的问题是这样的:当以前运行快速的查询突然在深夜开始运行,并且除此查询外没有其他影响,我该如何解决它以及如何避免将来发生?我怎么知道SQL在内部做的事情使其变得如此缓慢(如果运行了错误的查询,我可以得到它的执行计划,但它不会运行-也许预期的执行计划会给我一些东西?)?如果此问题与执行计划有关,那么如何避免SQL认为真正糟糕的执行计划是个好主意? 同样,这也不是参数嗅探的问题。我以前见过这种情况,不是这样,因为即使我在SSMS中对变量进行硬编码,性能仍然很慢。

2
为什么Denali序列的性能要优于Identity列?
在他对哪个更好的回答中:标识列或生成的唯一ID值?麦丁妮说: 当SQL Denali发布时,它将支持比身份更有效的序列,但是您自己无法创建更有效的序列。 我不确定。了解Oracle的序列后,我要么创建一个插入触发器,要么将每个插入封装到存储过程的调用中,要么祈祷当我进行临时插入时不要忘记正确使用序列。 我怀疑序列的优势是否如此明显。

1
MySQL:为什么mysql.db中有“测试”条目?
最近,我发布了有关mysql.db的问题的答案。 然后,我想到我应该问每个人这个问题: 多年以来,我注意到在安装MySQL 5.0+时,其中mysql.db填充了两个条目,允许匿名用户访问测试数据库。 您可以通过运行以下查询来查看它: mysql> select * from mysql.db where SUBSTR(db,1,4) = 'test'\G *************************** 1. row *************************** Host: % Db: test User: Select_priv: Y Insert_priv: Y Update_priv: Y Delete_priv: Y Create_priv: Y Drop_priv: Y Grant_priv: N References_priv: Y Index_priv: Y Alter_priv: Y Create_tmp_table_priv: Y Lock_tables_priv: Y Create_view_priv: Y Show_view_priv: …
36 mysql  security 

5
为什么仍然有varchar数据类型?
我的许多数据库都有定义为varchars的字段。这一直没有大的问题,因为我生活和工作在美国(其中存在的唯一语言是“美国”。啊哈) 在使用数据库大约5年之后,我发现我最终遇到了varchar字段性质有限的问题,必须修改字段以将数据存储为nvarchars。在不得不对表进行另一次更新,将varchar字段转换为nvarchar之后,我有了一个想法-为什么我们仍然这样做呢?我很早就做出了将所有新的文本字段都定义为nvarchar而不是varchar的明智决定,这是我10年前上学时从教科书中学到的内容。 是2011年,去年有一个新版本的SQL Server。当可以/应该使用nvarchar时,为什么为什么继续支持varchar数据类型? 我知道,经常有人争辩说nvarchars是varchars的“两倍大”,因此存储空间的使用可能是维护varcars的观点之一。 但是,今天的用户如果想节省存储空间,则可以定义其nvarchars将数据存储为UTF-8而不是默认的UTF-16。如果主要需要的话,这将允许8位编码,同时确保插入到其DB中的2-8字节罕见字符不会破坏任何内容。 我想念什么吗?在过去的15到20年中,这种情况没有发生变化,这是否有充分的理由?


2
WHERE子句是否按其编写顺序应用?
我正在尝试优化查询到一个大表(3700万行)的查询,并且对在查询中执行操作的顺序有疑问。 select 1 from workdays day where day.date_day >= '2014-10-01' and day.date_day <= '2015-09-30' and day.offer_id in ( select offer.offer_day from offer inner join province on offer.id_province = province.id_province inner join center cr on cr.id_cr = province.id_cr where upper(offer.code_status) <> 'A' and province.id_region in ('10' ,'15' ,'21' ,'26' ,'31' , …

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.