数据库管理员

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


1
为什么在我索引列时此sqlite查询要慢得多?
我有一个带两个表的sqlite数据库,每个表有50,000行,其中包含(假)人的名字。我构建了一个简单的查询,以找出两个表共有的名称(给定名称,中间名缩写,姓氏): select count(*) from fakenames_uk inner join fakenames_usa on fakenames_uk.givenname=fakenames_usa.givenname and fakenames_uk.surname=fakenames_usa.surname and fakenames_uk.middleinitial=fakenames_usa.middleinitial; 当除了主键之外没有索引(与该查询无关)时,它将快速运行: [james@marlon Downloads] $ time sqlite3 generic_data_no_indexes.sqlite "select count(*) from fakenames_uk inner join fakenames_usa on fakenames_uk.givenname=fakenames_usa.givenname and fakenames_uk.surname=fakenames_usa.surname and fakenames_uk.middleinitial=fakenames_usa.middleinitial;" 131 real 0m0.115s user 0m0.111s sys 0m0.004s 但是,如果我将索引添加到每个表的三列中(总共六个索引): CREATE INDEX `idx_uk_givenname` ON `fakenames_uk` (`givenname` ) //etc. …

4
更改查询以改善操作员估计
我有一个可以在可接受的时间内运行的查询,但我想从中获得最大的性能。 我要改进的操作是计划的右侧节点17处的“索引搜索”。 我已经添加了适当的索引,但是对于该操作,我得到的估计值是它们应有的一半。 我一直在寻找更改索引,添加临时表并重新编写查询的方法,但是为了获得正确的估算值,我无法对其进行简化。 有人对我可以尝试的方法有任何建议吗? 完整计划及其详细信息可以在这里找到。 可以在此处找到非匿名计划。 更新: 我觉得问题的最初版本引起了很多混乱,因此我将在原始代码中添加一些解释。 create procedure [dbo].[someProcedure] @asType int, @customAttrValIds idlist readonly as begin set nocount on; declare @dist_ca_id int; select * into #temp from @customAttrValIds where id is not null; select @dist_ca_id = count(distinct CustomAttrID) from CustomAttributeValues c inner join #temp a on c.Id …


2
堆压缩
以下是Microsoft Docs的一段: 在DML操作中分配给堆中的新页面在重建堆之前不会使用PAGE压缩。通过删除和重新应用压缩,或通过创建和删除聚簇索引来重建堆。 我不知道为什么会这样。如果我的堆具有指定的压缩设置,为什么不将其应用于属于该表的页面? 谢谢

2
如何在不到一秒钟的时间内跟踪发生的阻塞-SQL Server
我正在尝试解决不到一秒钟的阻塞问题。OLTP应用程序非常敏感,根据约定的SLA,某些事务的响应时间必须小于200ms。我们在新代码发行版中遇到了一些锁升级问题,可以通过减少更新中的批处理大小来解决这些问题。即使批处理量很小,我们也怀疑新sp阻塞了OLTP事务更新的同一行。 我需要找到被阻塞的会话及其等待的资源。根据我的理解,“阻塞的过程阈值”可以设置为至少1秒,因此这不会捕获阻塞。 我正在试验wait_info和wait_completed x事件。 还有其他方法可以跟踪此问题。谢谢

2
有关关系数据库中的查找表的最佳实践是什么?
查找表(或某些人称为代码表)通常是可以为特定列提供的可能值的集合。 例如,假设我们有一个查找表party(用于存储有关政党的信息),该表具有两列: party_code_idn,其中包含系统生成的数值,并且(缺少业务域的含义)可以用作实键的替代。 party_code是表的实键或“自然”键,因为它维护具有业务域内涵的值。 让我们说这样的表保留了以下数据: +----------------+------------+ | party_code_idn | party_code | +----------------+------------+ | 1 | Republican | | 2 | Democratic | +----------------+------------+ 在party_code列,这使价值“共和”和“民主”,在工作台的真正的关键,是建立了一个独特的约束,但我需要添加的party_code_idn,它定义为表(的PK虽然,从逻辑上说,party_code可以用作主键[PK])。 题 指向事务表中的查找值的最佳实践是什么?我是否应该建立外键(FK)引用(a)直接指向自然和有意义的值,或者(b)替代值? 例如,选项(a), +---------------+------------+---------+ | candidate_idn | party_code | city | +---------------+------------+---------+ | 1 | Democratic | Alaska | | 2 | Republican | Memphis | …

2
服务器在会话协商期间以空数据包作为响应,从而导致客户端给出了格式错误的数据包错误
我正在尝试连接到远程mysql服务器。这种情况发生的时间为100%。 客户端:mysql Ver 14.14 Distrib 5.7.12,用于Win32(AMD64) 服务器:5.0.95 这是我得到的错误: C:\>mysql -h example.com -P 3306 -D prod_rcadb -u username -p Enter password: ********** ERROR 2027 (HY000): Malformed packet 与mysqladmin相同的错误: C:\>mysqladmin -h example.com -P 3306 -u username -p version Enter password: ********** mysqladmin: connect to server at '10.106.24.79' failed error: 'Malformed packet' 因此,我进行了一次总结,只是想了解一下对话的样子。 …
14 mysql 

2
使用SqlCommand.Prepare()有什么意义和好处?
我遇到了开发人员代码,其中在执行SQL查询之前广泛使用了SqlCommand.Prepare()(请参见MSDN)方法。我想知道这样做的好处是什么? 样品: command.Prepare(); command.ExecuteNonQuery(); //... command.Parameters[0].Value = 20; command.ExecuteNonQuery(); 我玩了一些,并进行了追踪。调用Prepare()方法后,Command的执行使Sql Server执行以下语句: declare @p1 int set @p1=1 exec sp_prepexec @p1 output,N'@id int,@desc text',N'INSERT INTO dbo.testtable (id) VALUES (@id)',@id=20' select @p1 之后,当获取参数的值并SqlCommand.ExecuteNonQuery()调用该参数时,将在Sql-Server上执行以下操作: exec sp_execute 1,@id=20 对我来说,这看起来像该语句在Prepare()执行后立即得到了编译。我想知道这样做有什么好处?这是否意味着将其放入计划缓存中,并且可以在使用所需参数值执行最终查询后立即重新使用它? 我发现(并记录在另一个问题中)用SqlParameters执行的SqlCommands总是包装在sp_executesql过程调用中。这使Sql Server能够独立于参数值存储和重用计划。 关于这一点,我想知道该prepare()方法是无用的还是过时的,或者我是否在这里遗漏了什么?

1
我可以告诉何时和谁在Azure上将数据库从v11更新到v12吗?
今天早些时候,我注意到我所有的Azure SQL数据库服务器都从v11更新到了v12。我是公司中唯一应触摸这些拨盘的人,但不是公司中唯一具有访问权限的人。由于我没有启动此升级,因此我想找出是谁进行的以及何时进行此计划外的更新。 我知道我可以给公司的每个人写一封电子邮件,并且可以礼貌地向WTF询问信息,但是我宁愿以尽可能多的事实开始对话。另外,我倾向于认为这是Microsoft / Azure SNAFU,因为升级所有服务器都太刻意了。

1
TempDB争用
我们在SQL Server 2014 SP1上有一个活动的OLTP 40GB数据库。发现查询随着IO_Completion等待而变慢,磁盘队列长度增加到900,并且SQL Server停止响应。我们尝试了什么: 重新启动实例,并在一分钟后开始以相同的方式运行。 第二次重新启动后,我们更改了每个tempdb数据文件的初始大小(创建了16个数据文件),它开始正常工作。 注意:我们将表变量用于中间结果集。这些结果集很小。 一个月内发生了两次。每次我手动向数据文件添加一点空间时,它就会开始正常工作。更有趣的是,我们在SQL Server 2008 R2和SQL Server 2012上使用的相同设置(相同的硬件,相同的文件夹和文件设置,相同的工作负载)可以正常工作。 请帮助我们找到永久的解决方案。 所有数据文件的初始大小都相同,为1000MB,当前为1500MB。都是一样的。每个自动增长为100MB。在此之前,我们面临着PFS和GAM页面争用的问题,我们增加到16个,问题得以解决。跟踪标记1117和1118均被启用。2个NUMA节点上的24个内核。所有数据文件都在同一卷上。简单磁盘,无SAN。 实例在物理计算机上。带表变量的查询和带哈希联接的查询是最常见的生成IO_Completion等待的方法。 wBob的详细回答促使我们进行了更详细的搜索。我们以前是怎么错过它的: 用户取消了数据库“ tempdb”中文件“ templog”的自动增长,或者在7704毫秒后超时。使用ALTER DATABASE可以为此文件设置较小的FILEGROWTH值,或显式设置新的文件大小。 每当发生这种类型的问题时,我们都会在日志中找到此问题。我们正在将TempDB移至单独的快速驱动器。

1
从具有不同用户权限的存储过程中执行SSIS程序包
由于所需的特权级别不同,我在允许我的用户以合理的方式执行SSIS包时遇到问题。 场景:我们创建了一个数据仓库,其中有两个不同的SSIS软件包负责向其中加载数据,一个要自动运行(通过SQL Agent作业,并且运行良好),另一个必须在以下位置运行:一旦上游数据完成并清理等,用户的需求。 该程序包执行非常特权的操作,包括在运行开始时备份数据库(当然),删除和重新创建计算表等。 我已经编写了一个存储过程,以通过[SSISDB]。[catalog]。[create_execution]和[SSISDB]。[catalog]。[start_execution]存储过程来执行此作业。 (我是系统管理员)。 由于SSISDB和MSDB要求执行排队的高级权限,存储过程在由普通用户运行时失败,并且程序包本身由于在其(较低)安全性上下文下运行而失败。 我已经试过: 我试图在存储过程中使用“ Execute As”解决问题,但是由于跨数据库链接问题,Trustworthy标志等而失败。 我还尝试通过让Agent作业运行程序包并仅从存储过程运行Agent作业来解决该问题,但是我很快陷入了一个痛苦的世界,涉及到: 无法按工作设置执行权限 希望通过中央服务器角色配置此访问权限,以适应随时间推移而变化的员工,并且作业只能由一个用户作为所有者 代理帐户,凭据与sql-auth登录等结合使用的黑暗世界 计划C和D 我能想到的唯一的选择就是创建具有提升权限的专用SQL Server登录名,并相信用户不要传递凭据,也不会丢失计划导入的人员的可审核性(在其他方面解决此问题的方法)组织)或自定义构建Web前端,纯粹是为了允许用户认证为“服务器角色”帐户,然后让Web应用在第二个(特权)连接下运行存储过程。 所以.... 是否有关于如何进行以下操作的建议: 让SSIS包执行特权操作 特权较低的用户(使用AD Windows帐户)执行 最好是通过中央服务器角色来管理运行作业的访问权限(我不容易为它们创建新的Windows组) 并且任何新的中级/代理帐户都是SQL Server Auth帐户(同样,对AD进行更改的能力非常有限) 我知道这里有很多活动部件(有些感觉就像是旋转的刀片),所以请让我知道您是否还想念其他信息。 蒂姆,干杯 编辑.... 因此,今天我创建了一个具有ssis_admin权限的专用SQL Server登录,创建了该用户拥有的三个SQL Server Agent作业,并将最终用户调用的存储过程更新execute as为该用户。由于无法调用create executionSQL Server登录名而失败,它需要Windows帐户。 我将用户存储过程更新为execute asWindows帐户,SQL Server以(AD服务帐户)身份运行,并且授予该证书ssis_admin,但失败并显示错误 当前的安全上下文无法还原。请切换到调用“ Execute As”的原始数据库,然后重试。 这并不能很快实现:(

3
如何重新加载链接服务器?
我正在使用Microsoft SQL Server 2014企业版。链接的服务器出现问题,需要重新启动服务器或停止MSSQLSERVER服务。当服务器再次运行时,(连接到DB2的)链接服务器无法正常工作,并且SQL Server显示此错误: 消息7302,级别16,状态1,行10 无法为链接服务器“ Airspe”创建OLE DB提供程序“ DB2OLEDB”的实例。 仅在几次重新启动服务器后,链接服务器才开始工作。 为什么需要多次重启服务器才能启动链接的服务器? 还有其他解决方案吗? 这是创建链接服务器之一的脚本: EXEC master.dbo.sp_addlinkedserver @server = N'AIRS', @srvproduct=N'Microsoft OLE DB Provider for DB2', @provider=N'DB2OLEDB', @datasrc=N'###.###.###.##',@provstr=N'Provider=DB2OLEDB; Data Source=#####;Persist Security Info=True;Password=**********; User ID=######;Initial Catalog=######; Network Address=###.###.###;Package Collection=AICOLDP;DBMS Platform=DB2/AS400', @catalog=N'#####' EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'AIRS',@useself=N'False',@locallogin=NULL,@rmtuser=N'#####',@rmtpassword='########' EXEC master.dbo.sp_serveroption @server=N'AIRS', @optname=N'collation compatible', @optvalue=N'false' EXEC master.dbo.sp_serveroption …

2
未使用计算列索引
我想根据两列是否相等来进行快速查找。我试图使用带有索引的计算列,但是SQL Server似乎没有使用它。如果仅使用带有索引的静态填充的位列,则会得到预期的索引查找。 似乎还有其他类似的问题,但是没有一个问题集中在为什么不使用索引上。 测试表: CREATE TABLE dbo.Diffs ( Id int NOT NULL IDENTITY (1, 1), DataA int NULL, DataB int NULL, DiffPersisted AS isnull(convert(bit, case when [DataA] is null and [DataB] is not null then 1 when [DataA] <> [DataB] then 1 else 0 end), 0) PERSISTED , DiffComp AS …

2
大量INSERT阻止SELECT
我遇到大量阻止SELECT操作的INSERT问题。 架构图 我有一个这样的表: CREATE TABLE [InverterData]( [InverterID] [bigint] NOT NULL, [TimeStamp] [datetime] NOT NULL, [ValueA] [decimal](18, 2) NULL, [ValueB] [decimal](18, 2) NULL CONSTRAINT [PrimaryKey_e149e28f-5754-4229-be01-65fafeebce16] PRIMARY KEY CLUSTERED ( [TimeStamp] DESC, [InverterID] ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = …

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.