数据库管理员

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

5
如何在大表上使用LEFT JOIN优化非常慢的SELECT
我正在谷歌搜索,自我教育和寻找解决方案数小时,但没有运气。我在这里找到了一些类似的问题,但不是这种情况。 我的桌子: 人(约1000万行) 属性(位置,年龄,...) 人与属性之间的链接(M:M)(约4000万行) 完整转储〜280MB 情况: 我尝试person_id从某些位置(location.attribute_value BETWEEN 3000 AND 7000),性别(gender.attribute_value = 1),出生年份(bornyear.attribute_value BETWEEN 1980 AND 2000)和眼睛颜色(eyecolor.attribute_value IN (2,3))选择所有人的身份()。 这是我的询问女巫用了3〜4 分钟。我想优化: SELECT person_id FROM person LEFT JOIN attribute location ON location.attribute_type_id = 1 AND location.person_id = person.person_id LEFT JOIN attribute gender ON gender.attribute_type_id = 2 AND gender.person_id = person.person_id …

1
如何在SQL Server 2012中转移dbo架构的所有权
我不小心给了用户db_owner模式的所有权(使用下面的UI中的复选框),现在我不能: 将所有权转让给另一个用户 从数据库中删除用户(尽管我可以在SQL Server中删除登录名) 我尝试了数据库主体在数据库中拥有一个架构,无法删除。 ALTER AUTHORIZATION ON SCHEMA::db_owner TO dbo 尽管成功完成了该操作,但用户仍然拥有所有权,并且该控件显示为灰色,因此我似乎也无法在用户界面中进行操作。 找到一个解决方案: 除了Arron的答案外,我还意识到我会在错误的DB(facepalm!)中运行以上命令。一旦纠正了数据库,上面的SQL和下面的答案都将起作用。

5
在手写代码中使用SQL Server的括号表示法有意义吗?
当代码生成器使用[]几乎所有内容的新Microsoft括号符号()生成输出时,它们通常会更简单。 当我第一次看到它时,我虽然赞叹了一些被禁止的引用标识符符号的转世。 据我所知,它是Microsoft的专有扩展(意味着Oracle不支持它)。 查看SQL Server,如果您定义如下表,则没有区别 CREATE TABLE [dbo].[Table_2] ([col1] [int], [col2] [int]); 要么 CREATE TABLE dbo.Table_2 (col1 int, col2 int); 这是个人或公司风格的问题。始终如一。 现在,如果您要将数据库迁移到Oracle,则没有选择。 您可以使用旧的带引号的标识符,但是它们区分大小写,这会造成很多麻烦。 从生成的代码中删除所有括号,避免使用空格,其他特殊字符和名称的保留关键字以及仅以大多数DBMS能够理解的方式进行编码,这是一个好主意吗?

1
在SQL Server中本地解码Base64字符串
我varchar在SQL Server的表中有一列,其中包含一个base64编码的文本字符串,我想将其解码为等效的纯文本 SQL Server是否有任何本机功能来处理此类事件? 一个示例base64字符串: cm9sZToxIHByb2R1Y2VyOjEyIHRpbWVzdGFtcDoxNDY4NjQwMjIyNTcxMDAwIGxhdGxuZ3tsYXRpdHVkZV9lNzo0MTY5ODkzOTQgbG9uZ2l0dWRlX2U3Oi03Mzg5NjYyMTB9IHJhZGl1czoxOTc2NA== 解码为: role:1 producer:12 timestamp:1468640222571000 latlng{latitude_e7:416989394 longitude_e7:-738966210} radius:19764

4
如何从联接中选择第一行,该联接在主键上返回多个行
这与以下问题有关: 连接多个表导致重复的行 我有两个要加入的表。他们共享密钥。人员表的每个主键只有一个名称,但是电子邮件表的每个personId都有多个电子邮件。我只想显示每人的第一封电子邮件。目前我每人多行,因为他们有多封电子邮件。我正在运行SQL Server 2005。 编辑:这是T-SQL。第一封电子邮件实际上是每人的第一封电子邮件行。 编辑2:我看到的第一封电子邮件将是SQL在查询过程中在连接中显示的第一封电子邮件行。没关系显示哪个电子邮件。只显示不超过一封电子邮件。我希望这一点更加清楚。 Table1: Person Table2: Email Select Person.PersonName, Email.Email From person left join on Person.ID=Email.PersonId;

6
更改sa密码
我正在尝试使用SQL Server Management Studio 2012更改sa帐户的密码。我已按照以下步骤操作,但是密码仍然相同。 登录到SQL Server Management Studio,选择数据库引擎,\ SBSmonitoring,Windows身份验证。 转到对象资源管理器-安全文件夹-登录文件夹。 右键单击SA帐户,然后选择“属性”选项。 在“常规页面”中,更改SA密码并确认。 在状态页中,将登录更改为已启用。单击确定以保存更改。 重新启动SQL Server及其所有服务。 任何想法 ?
15 sql-server 


1
删除其他表中未引用的行
我在PostgreSQL 9.3数据库中有两个表:表link_reply有一个名为which_group指向table 的外键link_group。 我要删除link_group不link_reply存在相关行的所有行。听起来很基本,但我一直在努力。 这样简单吗(不起作用)? DELETE FROM link_group WHERE link_reply = NULL;


1
是否有一种优雅的方式将查询结果直接发送到物理打印机?
我收到了这个奇怪的请求,要求安排报告并打印到打印机。 该报告本身非常简单,可以放在单个页面上。我可以将其打印为txt,这样就可以了(尽管我愿意接受有关更好产品的建议)。 这是代码。有用。但是我不喜欢。具体来说,我想取消嵌套的@bcp和@SQL。 问题:是否有更优雅的方法可以做到这一点? declare @filepath varchar(255), @filename varchar(255), @filetype varchar(255), @sql nvarchar(max), @coverpage_text nvarchar(max) set @filepath = 'C:\users\jmay\documents\' SET @filename = 'TestFile' set @filetype = '.txt' --output to txt set @sql = N'declare @bcp varchar(4000) set @bcp = ''bcp " select * from test_data " queryout ' + @filepath …
14 sql-server 

3
为什么MySQL甚至对这个顺序强制也忽略索引?
我运行EXPLAIN: mysql> explain select last_name from employees order by last_name; +----+-------------+-----------+------+---------------+------+---------+------+-------+----------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-----------+------+---------------+------+---------+------+-------+----------------+ | 1 | SIMPLE | employees | ALL | NULL | NULL | NULL | NULL | …

4
RAID0代替RAID1或5,这很疯狂吗?
我正在考虑为我们的一个SQL Server群集使用RAID0设置。我将概述情况,并在寻找为什么这可能不是一个好主意。同样,如果您有用例,白皮书或其他文档的人,您可以在这个主题上向我指出,那就太好了。 我们在2个数据中心中有3台服务器,它们是SQL群集的一部分。它们都在可用性组中运行SQL Server。主数据库旁边有一个副本,另一个数据库中有另一个副本。他们正在运行具有自动故障转移功能的同步复制。所有驱动器均为企业级SSD。他们将运行SQL Server 2017或2019。 我认为与其他方法相比,在RAID0阵列上运行它们会带来多种好处,并且几乎没有真正的缺点。我目前看到的唯一负面消息是主服务器上缺乏冗余,因此失败率增加了。作为专家: 如果驱动器发生故障,而不是一直运行到慢速,降级的状态,直到有人收到手动操作的通知,服务器将立即失败,导致辅助服务器保持完整的操作能力。通知我们有关故障转移的更多好处,因此我们可以更快地调查原因。 它减少了每TB容量整体发生故障的机会。由于不需要奇偶校验或镜像驱动器,因此减少了每个阵列的驱动器数量。使用更少的驱动器,发生驱动器故障的机会就更少了。 这更便宜。需要更少的驱动器以达到我们所需的容量显然会降低成本。 我知道这不是传统的商业思想,但是我有没有在考虑什么呢?我会喜欢任何赞成或反对的意见。 我并不想这样做,以提高查询性能,但是如果有有意义的建议,请随时指出。我最关心的是无法考虑或解决我从未想到的可靠性或冗余性问题。 操作系统位于单独的镜像驱动器上,因此服务器本身应处于启动状态。这些驱动器之一可以更换并再次镜像。它很小,除了系统DB之外没有任何数据库文件。我无法想象这需要花费几分钟的时间。如果其中一个数据阵列发生故障,我们将更换驱动器,重建阵列,还原并与AG重新同步。以我个人的经验,恢复比RAID5驱动器重建快得多。我从来没有遇到过RAID1故障,所以我不知道该重建是否会更快。还原将来自备份,并前滚以匹配主数据库,因此,仅将最后几分钟的日志与恢复的副本同步,主服务器上的负载增加应该非常小。

1
直方图以外的基数估计
设定 我在了解基数估算值时遇到了一些麻烦。这是我的测试设置: 2010版本的Stack Overflow数据库 SQL Server 2017 CU15 + GDR(KB4505225)-14.0.3192.2 新CE(兼容级别140) 我有这个过程: USE StackOverflow2010; GO CREATE OR ALTER PROCEDURE #sp_PostsByCommentCount @CommentCount int AS BEGIN SELECT * FROM dbo.Posts p WHERE p.CommentCount = @CommentCount OPTION (RECOMPILE); END; GO dbo.Posts表上没有非聚集索引或统计信息(上有聚集索引Id)。 当要求为此的估计计划时,出来的“估计行” dbo.Posts为1,934.99: EXEC #sp_PostsByCommentCount @CommentCount = 51; 当我要求估算的计划时,会自动创建以下统计信息对象: DBCC SHOW_STATISTICS('dbo.Posts', [_WA_Sys_00000006_0519C6AF]); 其中的重点是: …

3
使用XPath / XQuery连接同一XML元素的所有值
我有这样的XML值: <R> <I>A</I> <I>B</I> <I>C</I> ... </R> 我想连接所有I值并将它们作为单个字符串返回:ABC...。 现在我知道我可以切碎XML,将结果聚合为无节点XML,然后应用于.values('text()[1]', ...)结果: SELECT ( SELECT n.n.value('text()[1]', 'varchar(50)') AS [text()] FROM @MyXml.nodes('/R/I') AS n (n) FOR XML PATH (''), TYPE ).value('text()[1]', 'varchar(50)') ; 但是,我只想使用XPath / XQuery方法来做所有事情,就像这样: SELECT @MyXml. ? ( ? ); 有这种方法吗? 我正在朝这个方向寻找解决方案的原因是因为我的实际XML也包含其他元素,例如: <R> <I>A</I> <I>B</I> <I>C</I> ... <J>X</J> <J>Y</J> <J>Z</J> ... …

2
恒定扫描假脱机
我有一张几十行的桌子。简化的设置如下 CREATE TABLE #data ([Id] int, [Status] int); INSERT INTO #data VALUES (100, 1), (101, 2), (102, 3), (103, 2); 我有一个查询,可以将该表连接到一组表值构造的行(由变量和常量组成)上,例如 DECLARE @id1 int = 101, @id2 int = 105; SELECT COALESCE(p.[Code], 'X') AS [Code], COALESCE(d.[Status], 0) AS [Status] FROM (VALUES (@id1, 'A'), (@id2, 'B') ) p([Id], [Code]) FULL JOIN …

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.