数据库管理员

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

1
处理使用insert-exec块调用的存储过程中的异常
我有一个在insert-exec块中调用的存储过程: insert into @t exec('test') 如何处理存储过程中生成的异常并仍继续处理? 以下代码说明了该问题。我想做的是根据内部exec()调用的成功或失败返回0或-1 : alter procedure test -- or create as begin try declare @retval int; -- This code assumes that PrintMax exists already so this generates an error exec('create procedure PrintMax as begin print ''hello world'' end;') set @retval = 0; select @retval; return(@retval); end …



2
用过滤的(非空值)索引替换索引有什么作用?
我们的项目运行着非常大,非常复杂的数据库。因此,大约一个月前,我们注意到包含空值的索引列使用的空间变得太大。为此,我编写了一个脚本,该脚本将动态搜索包含大于1%的空值的所有单列索引,然后在值不为空的情况下删除并重新创建这些索引作为筛选索引。这将在整个数据库中删除并重新创建数百个索引,通常会释放整个数据库使用的近15%的空间。 现在我对此有两个问题: A)以这种方式使用过滤索引的不利之处是什么?我认为这只会提高性能,但是会涉及性能风险吗? B)在删除和重新创建索引时,我们收到错误消息(“无法删除索引XYZ,因为它不存在或您没有权限”),即使事后检查,一切都按预期进行。怎么会这样 谢谢你的帮助! 编辑:响应@Thomas Kejser 嗨,谢谢,但事实证明这是一场灾难。当时我们还不了解几件事,例如: 在查询期间,SQLOS在确定不能使用NULL值联接表列之前先制定索引计划。IE,您确实确实需要有WHERE子句过滤器,以适合查询中使用的每个过滤索引的索引,否则该索引将根本不使用。 删除和创建索引,然后再次冗余更新其统计信息可能仍然不足以产生更新的计划,而我们认为是可以的。在某些情况下,似乎只有足够高的工作量会迫使SQL Server重新评估计划。 执行计划程序的功能有些奇特之处,仅凭常识和逻辑很难确定。甚至在成千上万的由代码背后生成的不同查询的变体中,看似无用的索引也可以帮助进行某些统计和查询计划,最终将其用于关键查询中。 最后,这些更改被还原。因此,过滤后的索引是一个强大的工具,但是您需要真正了解从这些列中获取的数据。除了空间问题以外的常规索引都非常容易应用,而过滤后的索引则代表了非常定制的解决方案。它们当然不能代替常规索引,而是在需要它们的特殊情况下对其的扩展。

3
将公式存储在表中并在函数中使用该公式
我有一个PostgreSQL 9.1数据库,其中部分处理代理佣金。每个代理商都有自己的计算公式,他们可以得到多少佣金。我有一个函数来生成每个代理应获得的佣金数量,但是随着代理数量的增加,它变得无法使用。被迫做一些非常长的case语句和重复代码,这使我的功能变得非常庞大。 所有公式都有常量变量: d ..该月工作的天数 r ..新节点累积 l ..忠诚度得分 s ..子代理人佣金 b ..基本利率 我..获得的收入 公式可以是: d*b+(l*4+r)+(i/d)+s 每个代理商与人力资源部门协商付款方式。因此,我可以将公式存储在代理表中,然后像一个小的函数一样,仅从表中获取公式并将其转换为值并计算金额吗?

4
如何处理大型未记录数据库
最近,我被某公司X聘为唯一的IT专家,我的任务是修复他们的应用程序,我认为,最好的开始方法是了解数据库。 他们当前的数据库是带有186个表的MySQL数据库(请注意,有些表是空的,上帝知道原因)。应用程序正在通过MS Access数据库接口与数据库进行通信。(我问自己为什么开发商也这样做) 问题是,如何开始处理这个大型的未公开文档的数据库?是的,它没有记录,因为应用程序的开发人员不愿意给我ERD或数据字典或有关数据库的任何信息来简化我的生活。您如何建议您进行这项艰巨的工作,即了解相当大的数据库的每个细节? 相关问题:如何进入一个丑陋的数据库?

4
无法以单用户模式连接到SQL Server
我已经开始我SQL Server 2008 sqlcst02\inst01在Single User Mode通过附加;-m到该实例在启动参数结束SQL Server Configuration Manager。我已经停止SQL Server Agent了inst01实例。我的帐户的一员Domain Admin group,我已经用试图登录sqlcmd -S sqlcst02\inst01,并不断收到错误,该服务是Single User Mode只有一个管理员可以登录。我尝试添加;-m"sqlcmd"到启动参数来限制只是连接sqlcmd,但我得到的相同的结果。我已经尝试过以我自己的帐户登录,并以本地管理员帐户登录。我已经以本人和管理员身份启动了命令提示符,但得到的结果相同。我尝试使用ADMIN:sqlcst02\inst01in 连接SSMS。没运气。 我正在尝试重置sa密码,因为以前的管理员没有为我保留此信息。这太疯狂了。我之前在其他机器上都做到了这一点,没有任何问题。

1
Cassandra中色谱柱系列的实际限制是什么?
在卡桑德拉(Cassandra)中,建议不要有数千个以上的列族,为便于讨论,假设有2,000个。在需要保留2,000种以上数据类型的情况下,一种方法是将多个不相关类型的数据分片到每个列族中。 例如,单个CF可以包含订单,发票和客户,条件是它们的行键是不同的(例如,以对象类型为前缀,即单个CF的键可以同时包含Order|1234和Customer|1234)。第二个CF可以包含说地址,LineItems和OrderTypes。考虑到这种方法的基本可行性,实际的限制是什么?例如,将所有10,000种类型的对象放入一个CF中会出现什么问题?据我从Cassandra Wiki所知道的,CF的大小没有严格限制。


3
在另一个作业中调用SQL Server作业
是否可以调用SQL Server作业在另一个作业中运行? 我知道我们可以将作业1的所有步骤添加到作业2中,但是我不愿意这样做。首先,作业2已经很大,其次,我找不到在作业之间复制步骤的复制粘贴选项,因此手动添加步骤会很耗时。 任何建议表示赞赏。

1
SQL Server 2000到2008到2012
我们现在正在从SQL Server 2000迁移到2008。我们正在对代码,脚本进行大量更改,因为自2000年到2008年以来发生了许多更改。在进行这些更改时,我想知道的是-我现在可以做些什么使它与2012年兼容同一时间。尽量避免从2012年到2008年等向后兼容的更改。我想这样做的原因是,当我们决定从2008年到2012年迁移时,尽量减少将来(从现在到3到4年)的工作量。我能做的还是需要知道的?

3
如何配置SQL Server 2012,以便它可以还原并查看用户帐户中的文件?
我有一个SQL Server 2012实例作为服务在我的计算机上运行,​​并且根据服务页面以帐户 “ NT Service \ MSSQLSERVER” 登录。但是,在计算机管理屏幕的“本地用户和组”区域中,我在其他任何地方都看不到该帐户名,因为如下面的链接所述,这不是用户帐户,而是服务名称,在该框中,微软因此很有帮助地将其标记为“帐户”。在这一点上,我可以看到很多人感到困惑。 我要完成的任务是使用SSMS对话框“查找备份文件”还原文件,该对话框使用的对话框与任何标准Windows文件打开对话框完全不同,可能是因为它正在执行“远程”作业并从SQL Server的安全上下文是最终用户混乱的另一个丰富来源,我希望这个问题可能有助于解决。 到目前为止,如果要还原我的一个文件夹中的备份.mdf / .bak文件,则必须将该文件夹设置为“所有人都可读”,否则我将无法使用SQL Server“查找备份”进入该文件夹。文件”窗口。我发现这个想法是,您正在使用GUI与具有与您不同的用户帐户和权限的服务进行对话,即使我在Windows系统管理方面有多年经验,Microsoft的所有人也都不会理会您,这很令人困惑。 我希望我错过了一些SQL Server文档页面,这些页面将告诉您在安装新的SQL Server实例之后如何设置安全性。 像这样的论坛帖子甚至让Microsoft工作人员说“这很复杂”,而在Denali中又“改变了”。现在,它在SQL Server 2012中如何工作,以及如何向SQL数据库引擎的安全性添加读取属于用户的文件的权限SID。

1
不为每个表从统一查询中计算MATCH()AGAINST()分数
我正在尝试对SELECT语句的整个部分进行评分 SELECT *,MATCH(`result`) AGAINST('keyword') as `score` FROM `table1` WHERE MATCH(`result`) AGAINST('keyword') UNION SELECT *,MATCH(`content`) AGAINST('keyword') as `score` FROM `table2` WHERE MATCH(`content`) AGAINST('keyword') UNION SELECT *,MATCH(`text`) AGAINST('keyword') as `score` FROM `table3` WHERE MATCH(`text`) AGAINST('keyword') 在这种情况下,分数是每张桌子的分数+它们不是按相关性排序的 但是我尝试了这种方法,这种方法虽然有效,但不值得生产 SELECT * FROM ( SELECT *,MATCH(`result`) AGAINST('keyword') as `score` FROM `table1` WHERE MATCH(`result`) AGAINST('keyword') UNION …

1
查询优化:时间间隔
总的来说,我有两种时间间隔: presence time 和 absence time absence time 可以具有不同的类型(例如休息,缺席,特殊日子等),并且时间间隔可能重叠和/或相交。 这是不肯定的,只有间隔的合理组合,原始数据存在,例如。重叠的存在间隔没有意义,但可能存在。我现在尝试通过多种方法来确定出现的时间间隔-对我来说,最舒服的似乎是紧随其后的时间间隔。 ;with "timestamps" as ( select "id" = row_number() over ( order by "empId", "timestamp", "opening", "type" ) , "empId" , "timestamp" , "type" , "opening" from ( select "empId", "timestamp", "type", case when "types" = 'starttime' then 1 else -1 …

3
使用分布式交换机将V​​MWare guest虚拟机批量插入SQL Server
这很可能不是SQL Server问题,但设置似乎仅影响对SQL Server的批量插入。 我们最近移动了VM硬件,并且所有移动的客户机都将其虚拟交换机从标准更改为分布式。 然后我开始接收 从网络读取输入流时发生致命错误。会话将终止(输入错误:64,输出错误:0) 在大容量插入操作期间在两个SQL服务器上运行。其中一台SQL服务器是具有新配置的VM,另一台是物理服务器。两种BULK INSERT操作均源自具有新配置的VM。批量插入不会每次都失败,这是非常随机的。 当我们将虚拟交换机更改为标准交换机而不是分布式交换机时,问题就消失了。 我正在寻找更多关于为什么它不适用于分布式开关而不是分辨率的解释。我的猜测是,BULK INSERT操作是串行的,使用分布式交换机时,数据包将通过不同的主机进行路由,其中​​某些主机可能比其他主机更忙,并且到达目的地服务器的时间超过某些延迟阈值。(注意:在源服务器或目标服务器上发生错误时,Windows事件日志中都没有任何内容) 更新:原来问题出在网卡上。我们所有的虚拟机都配置有E1000 NIC,该NIC在标准交换机上运行良好。转移到分布式交换机后,我们开始看到大型数据传输的问题,而不仅仅是sql查询。将NIC更改为VMXNET3似乎已解决了该问题。

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.