数据库管理员

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

3
休眠的SPID阻止了其他事务
我确实很难找到我们遇到的一些障碍。 根阻止SPID的状态为“正在休眠”,cmd为“正在等待命令”,并且sqltext为SET TRANSACTION ISOLATION LEVEL READ COMMITTED。 当我查看“按阻塞的交易计数列出的最高交易”报告时,阻塞的SQL语句为“-”。 我已经在SQL上执行了跟踪,并且当阻塞发生时是在跟踪根阻塞SPID,但它并没有真正引导我到任何地方。最后一个trace语句与sqltext上面的相同SET TRANSACTION ISOLATION LEVEL READ COMMITTED。 我检查了所有可以找到的相关存储过程,以确保它们具有TRY / CATCH BEGIN TRAN / COMMIT TRAN / ROLLBACK TRAN语句(我们将存储过程用于所有内容,因此没有独立的语句在运行)。该问题在过去的24小时内才刚刚开始发生,并且没有人声称对系统进行了任何更改。 解决方案:我们很少使用的存储过程之一有一个插入错误(列数不匹配),但是我们仍然对正在发生的事情感到困惑。 查看所有跟踪信息时,有时会列出该存储过程的EXEC语句,但绝不会在阻塞SPID上发生BLOCK之前。看来,当它开始阻塞时,跟踪并没有记录它(或其中的任何一条语句)的执行情况。但是,还有其他时间跟踪确实记录了它的执行并且没有发生阻塞。 存储过程错误报告来自用户,我能够在跟踪中找到多个EXEC语句并在SSMS中运行它们。当我运行它们时,我们没有任何阻塞发生或挂起的情况。它们按预期运行(错误后触发catch块并回滚了事务)。解决了存储过程的问题后,我们再也没有看到此问题。

2
如何避免在WHERE子句中使用变量
给定一个(简化的)存储过程,例如: CREATE PROCEDURE WeeklyProc(@endDate DATE) AS BEGIN DECLARE @startDate DATE = DATEADD(DAY, -6, @endDate) SELECT -- Stuff FROM Sale WHERE SaleDate BETWEEN @startDate AND @endDate END 如果Sale表很大,则SELECT可能要花很长时间才能执行,这显然是因为优化器由于局部变量而无法优化。我们测试了SELECT使用变量运行零件,然后对日期进行了硬编码,执行时间从〜9分钟缩短至〜1秒。 我们有许多存储过程可根据“固定”日期范围(周,月,8周等)进行查询,因此输入参数仅为@endDate,而@startDate是在过程内部计算的。 问题是,避免在WHERE子句中使用变量以免损害优化程序的最佳实践是什么? 下面显示了我们提出的可能性。这些最佳实践中的任何一种还是其他方法? 使用包装程序将变量转换为参数。 参数不会像局部变量那样影响优化器。 CREATE PROCEDURE WeeklyProc(@endDate DATE) AS BEGIN DECLARE @startDate DATE = DATEADD(DAY, -6, @endDate) EXECUTE DateRangeProc @startDate, @endDate END …

6
从表中查找“ n”个连续的免费电话
我有一些这样的数字表(状态为免费或已分配) id_set号状态 ----------------------- 1 000001已分配 1 000002免费 1 000003已分配 1 000004免费 1 000005免费 1 000006已分配 1 000007已分配 1 000008免费 1 000009免费 1 000010免费 1 000011已分配 1 000012分配 1 000013已分配 1 000014免费 1 000015已分配 并且我需要找到“ n”个连续数字,因此对于n = 3,查询将返回 1 000008免费 1 000009免费 1 000010免费 它应仅返回每个id_set的第一个可能的组(实际上,每个查询仅对id_set执行一次) 我正在检查WINDOW函数,尝试了诸如之类的查询COUNT(id_number) OVER (PARTITION BY id_set ROWS …


2
多对多和弱实体
我有一个不能被另一个定义的实体,并且我希望这个实体参与多对多关系。 示例:一个艺术家有一个专辑(没有艺术家就不能存在该专辑),该专辑也有许多曲目,但是同一首曲目可以存在于许多专辑中。 因此,专辑和曲目之间存在多对多的关系。 如果专辑是一个弱实体,则它的主键是引用艺术家的外键,因此它不能是代表多对多关系的另一个表的外键。 问题是:在SQL中是否可能有这种关系,如果是这样,我该如何表达呢?

1
更新expire_logs_days参数并重新启动sql之后多久会删除旧的binlog?
MySQL 5.1.x | InnoDB | 视窗 我的mysql数据目录开始充满bin日志。 我目前在Windows mysql服务器中配置了以下设置: [mysqld] log-bin server-id=1 binlog-do-db=foodb1 binlog-do-db=foodb2 expire_logs_days=25 我打算将expire_logs_days设置更改为expire_logs_days=10并跳出mysql服务。进行此更改后,我可以期望多长时间后清除旧的bin日志。 这是否仅作为每晚计划任务的一部分进行?还是应该立即进行?


2
临时表中的varchar大小重要吗?
在我妻子的工作中,关于仅对存储过程中的临时表中的varchar(255)所有varchar字段使用都存在争议。基本上,一个营地希望使用255,因为即使定义更改,它也将始终有效,而另一个营地则希望坚持使用源表中的大小以提高性能。 表演营对吗?还有其他含义吗?他们正在使用SQL Server。

3
SQL Server NTFS分配单位大小
在运行SQL Server 2008 R2的Windows 2008 R2上,NTFS分配单元大小对DISK IO性能的影响至关重要。在我看来,为任务关键型应用构建少量服务器的服务器管理员将NTFS分配单位大小(群集大小)保留为默认4 KB而不是64 KB。SQL服务器已安装。 是否值得付出痛苦-卸载SQL-用64 KB群集大小格式化驱动器并重新安装SQL Server?

2
PostgreSQL索引缓存
我很难找到有关如何在PostgreSQL中缓存索引的“一般性”解释,因此我希望对以下任何或所有假设进行现实检查: PostgreSQL索引(如行)位于磁盘上,但可以缓存。 索引可能完全在高速缓存中,或者根本不存在。 是否缓存它取决于使用频率(由查询计划者定义)。 因此,大多数“明智的”索引将一直存在于缓存中。 索引buffer cache与行位于同一高速缓存(?)中,因此索引所使用的高速缓存空间不可用于行。 我理解这一点的动机来自另一个问题,我曾问过有人建议在不能访问大多数数据的表上使用部分索引。 在进行此操作之前,我想弄清楚使用部分索引有两个优点: 我们减小了缓存中索引的大小,从而为缓存中的行本身释放了更多空间。 我们减小了B树的大小,从而加快了查询响应速度。

3
在SAN环境中对SQL索引进行碎片整理有什么好处?
我们的SQL服务器位于SAN上。它包含数十个OLTP数据库,其中一些数据库包含100万条以上的记录。 我们每周运行Ola Hallengren的索引维护脚本,并且每次运行几个小时。根据碎片阈值,脚本将重新组织索引或为索引重新编制索引。我们已经观察到,在重新索引期间,日志文件会变得很大,这会导致日志传送过程中带宽的过度消耗。 然后是Brent Ozar的一篇文章,他说不再停止担心SQL索引: 您的硬盘驱动器与其他同时共享驱动器请求的服务器共享,因此驱动器将始终在各处跳跃以获取数据。整理索引碎片只是毫无意义的繁忙工作。 谷歌搜索这个问题会导致意见分歧,其中大多数观点似乎太简短或太弱。我们的暂定计划是调整维护脚本中的碎片阈值,以使其重新组织的频率比重新编制索引的频率高得多。 最终裁决是什么?考虑到每周运行维护工作所带来的负担,是否值得对SAN上的SQL索引进行碎片整理?

3
SQL Server LocalDB实例;恢复备份时出错(MasterDBPath不可用)
我已经安装了SQL Server 2012本地数据库,并且正在通过(localdb)\ v11.0连接到它。 尝试还原备份文件时,我得到: 标题:Microsoft SQL Server Management Studio 属性MasterDBPath不可用于信息'Microsoft.SqlServer.Management.Smo.Information'。该属性对于该对象可能不存在,或者由于访问权限不足而无法检索。(Microsoft.SqlServer.Smo) 要获取帮助,请单击:http : //go.microsoft.com/fwlink? .PropertyCannotBeRetrievedExceptionText&EvtID = MasterDBPath&LinkId = 20476 我尝试在以下位置设置MasterDBPath字符串值: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL11E.LOCALDB\MSSQLServer\CurrentVersion` 但这没有帮助。 有人有什么想法吗?
16 sql-server 

2
SQL Server-增长数据库文件的最佳实践
我已经通过SQL Server 2008 R2中的数据收集器监视文件增长了两个星期。该数据库以每天约35(MB)的速度持续增长。该数据库尚未达到2 GB的初始大小。 数据库文件的自动增长设置为5MB,我想尝试另一种方法,所以我正在寻找建议和/或评论。 每个星期天晚上1:30 AM都会运行一项调优任务。该任务将: 检查数据库完整性 缩小日志文件–(可以,因为日志记录模式很简单) 收缩数据库 重组索引 重建索引 更新统计 清理历史 我想在每周调整计划中增加两个步骤: 如果使用的空间达到某个阈值或总大小,则将数据库文件增加500 MB。 如果使用的空间达到总大小的特定阈值,则将日志文件增加250 MB(缩小后)。 通过将增长负担放在离线时间,我希望通过减少重负载下的自动增长事件的数量来提高性能。 我有两个有关自动增长文件的问题。 放置文件增长步骤的最佳位置是在当前步骤之前还是之后? 如果我使用ALTER DATABASE|MODIFY FILE来增大文件,那么如何确定是否SpaceUsedInFile >= (TotalFileSpace-@AllowanceThreshold)呢?

1
为什么两周不活动后Oracle会话仍然有效
数据库:Oracle 10g 操作系统:Windows Server 2003 64位 我查询Web应用程序生成的Oracle会话列表(按program = w3wp.exe筛选) select * from V$session where UPPER(program) LIKE '%W3%' order by logon_time 根据Logon_Time,为什么在2012年7月31日或2012年8月1日或今天(2012年8月21日)之前的任何会议中仍存在活动会话? 我在sqlnet.ora上进行了配置:SQLNET.EXPIRE_TIME = 20因此,这意味着Oracle每20分钟检查一次连接是否仍处于活动状态。 所有用户方案都有默认配置文件。这意味着没有会话将永不过期或死亡吗? 在回应Phil的评论时添加: 补充了Phil的回答:


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.