数据库管理员

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

1
PostgreSQL:TRUNCATE后未释放磁盘空间
我有TRUNCATE一个巨大的表(〜120Gb),名为files: TRUNCATE files; VACUUM FULL files; 表大小为0,但没有释放磁盘空间。有什么想法如何找回丢失的磁盘空间吗? 更新: 大约12个小时后释放了磁盘空间,我这边没有采取任何措施。我使用Ubuntu 8.04服务器。


2
如果按顺序执行,这两个查询会导致死锁吗?
几乎可以肯定这是我提出另一个问题的原因,但是我认为有必要将两者分开,因为我有一个假设,该假设基于以下日志,我希望对其进行伪造或验证。 我的假设是,另一个死锁实际上是以下查询的结果,根据我的理解,隐藏原始查询的原因是innodb状态仅显示最近的事务(这对吗?)。 根据日志,我检查了我们的代码,发现依次执行了以下两个查询: db.Execute("UPDATE people SET iphone_device_id=NULL WHERE iphone_device_id=@0 AND people_id<>@1", DeviceID, m_User.people_id); // I have hard coded this query in this snippet to simplify things db.Execute("UPDATE people SET company_id = 444, name = 'Dad', password = '<pass>', temp_password = NULL, reset_password_hash = NULL, email = '<redacted>@gmail.com', phone = NULL, …


2
LNNVL证明
LNNVL是一个Oracle内置函数,对于评估为FALSE或UNKNOWN的条件返回TRUE,对于评估为TRUE的条件返回FALSE。我的问题是,返回真值条件的对立而不只是处理NULL值有什么好处? 例如,假设您有一个包含StartCommission和CurrentCommission列的Emp表,其中的列可能包含空值。以下仅返回两个都不为null的行: SELECT * FROM Emp WHERE StartCommission = CurrentCommission; 如果要包括其中任一佣金为null的行,则可以执行以下操作: SELECT * FROM Emp WHERE StartCommission = CurrentCommission OR StartCommission IS NULL OR CurrentCommission IS NULL; 似乎存在一个可以缩短此语法的函数,但是使用LNNVL会返回所有非相等记录以及所有具有空值的记录。 SELECT * FROM Emp WHERE LNNVL(StartCommission = CurrentCommission); 向其添加NOT只会返回不包含null的行。在我看来,这种情况下所需的功能是保持真实条件为真,错误条件为假以及未知条件为真。我真的在这里创建了一个低用例吗?是否真的更有可能想要将未知变成真实,将真实变成虚假,以及将虚假变成真实? create table emp (StartCommission Number(3,2), CurrentCommission Number(3,2)); insert into emp values (null,null); insert …


5
按小时按大型数据集分组
我使用MS SQL 2008从250万条记录中选择一个平均字段。每条记录代表一秒钟。MyField是这些1秒记录的每小时平均值。当然,服务器CPU达到100%,选择时间太长。我可能需要保存这些平均值,以便SQL不必在每个请求中都选择所有这些记录。该怎么办? SELECT DISTINCT CONVERT(VARCHAR, [timestamp], 1)+' '+ CAST(DATEPART(Hh,[timestamp]) as VARCHAR) AS TimeStampHour, MIN([timestamp]) as TimeStamp, AVG(MyField) As AvgField FROM MyData WHERE TimeStamp > '4/10/2011' GROUP BY CONVERT(VARCHAR, [timestamp], 1)+' '+ CAST(DATEPART(Hh,[timestamp]) as VARCHAR) ORDER BY TimeStamp
12 sql-server  query 

4
在列上放置约束(索引)
如何修改具有索引的表的类型?我试图在一个空表上做一个alter列,以将类型从日期时间修改为varchar(15),并收到错误消息说它对列有依赖性(原来是索引)。 通过右键单击索引并编写脚本脚本,可以轻松地在本地解决此问题,但需要在无法访问索引名称的其他服务器上进行扩展。 有没有办法使脚本删除所有索引,让我在列上更改数据类型,然后读取索引?谢谢!

4
何时使用XML数据类型
我负责在项目上创建数据库。我们的字段很少会具有值(每10,000条记录中有1个),我正在尝试找出将其存储在数据库中的最佳方法。 据我所知,我有3种选择: 在表格中为每个附加值添加一列 添加一个链接表,该表引用原始表,并且仅在需要存储值的位置才有记录 在原始表中使用XML数据类型,并在其中存储所有值。 还有其他我没有考虑的选择吗? 我正在尝试找出每种方法的利弊。据我所知,1是最简单的,2将占用最少的空间,但是我一直在努力寻找3的许多资源。


3
索引如何影响查询性能?
显然,保留几个不同的索引会对插入和删除性能产生负面影响。查询性能如何:在一个表上保留太多索引完全有意义吗?在任何情况下添加索引都会提高查询性能(当然,对于使用索引的查询而言)还是会因为索引过多而降低查询性能,因为有必要查询所有索引以获取索引。结果? 如果表上有不同的索引:是否会全部考虑这些索引,或者从优化程序的角度来看仅是最佳索引?Oracle是否实现多维索引?

3
从C#VS SSMS执行相同的请求会产生不同的执行时间
我有这样的要求 SELECT [EstimateId], [CreationUserId], [EstimateStatusValueId], [LanguageId], [LocationId], [EstimatorUserId], [FilterUnitSystemTypeId], [EstimateNumber], [RevisionNumber], [CreationDate], [ModificationDate], [ProjectDescription], [IsBsdq], [ClosingDate], [ClosingTime], [ClosingUpdatedOn], [DeadLineDate], [IsReceived], [Inclusion], [Exclusion], [Misc], [Note], [WorkDeadLines], [Comments], [Validity], [PlansLocation], [PlansReceivedFrom], [Price] FROM [Estimate].[Estimates] ORDER BY [ClosingDate] ASC, [ClosingTime] ASC 当我在SSMS中运行此查询时,我的执行时间为953ms,但是当我从C#中的Linq查询中运行此查询时,我的执行时间为1813ms。 Linq查询使用“ .Net SqlClient数据提供程序”,并针对EntityFramework(EDMX文件)发出。这可能是一个问题吗? 有谁知道为什么我在相同请求但针对同一数据库从不同上下文执行的那些请求的执行时间之间有很大差异? 我验证了两个请求的所有执行计划,并且它们使用相同的索引来满足各自的查询。 为了查看C#请求的执行计划,我使用SQL事件探查器捕获了Show Plan XML事件,并将其与SSMS之一进行比较,并且两者相同。

3
跟踪,调试和修复行锁争用
迟到了,我遇到了很多行锁争用。争用的表似乎是特定的表。 通常就是这样- 开发人员1从Oracle Forms前端屏幕开始事务 开发人员2使用同一屏幕从不同的会话开始另一笔交易 大约5分钟后,前端似乎没有反应。检查会话显示行锁争用。每个人都抛出的“解决方案”是终止会话:/ 作为数据库开发人员 如何消除行锁争用? 是否有可能找出存储过程的哪一行引起这些行锁争用 减少/避免/消除此类问题的通用准则是什么? 如果您觉得此问题过于开放/信息不足,请随时进行编辑/让我知道-我会尽力补充一些其他信息。 有问题的表有很多插入和更新,我想说它是最繁忙的表之一。SP相当复杂-为简化起见-它从各种表中获取数据,将其填充到工作表中,在工作表上发生许多算术运算,并且将工作表的结果插入/更新到有问题的表中。 数据库版本为Oracle Database 10g企业版10.2.0.1.0版-64位。逻辑流在两个会话中以相同的顺序执行,事务未保持打开状态的时间过长(或至少我认为如此),并且在事务的主动执行过程中发生了锁定。 更新:表行数比我预期的要大,大约为310万行。另外,在跟踪会话后,我发现该表的几个更新语句没有利用索引。为什么会这样-我不确定。where子句中引用的列已建立索引。我目前正在重建索引。

4
在Windows中安装默认的MySQL表(mysql_install_db)
在Linux中,可以使用该mysql_install_db脚本创建默认的MySQL授权表,但这在Windows上不起作用。 如何在Windows上安装默认授权表? (不,我不是在寻找关于Google的结果如何在Windows上自动安装的包装,因为这只是安装程序发行版的情况,而不是ZIP包。此外,这在以后没有帮助MySQL已安装且数据目录已损坏或正在被替换等。)

2
Postgresql 8.3:限制每个查询的资源消耗
我正在使用PostgreSQL 8.3 + PostGIS 1.3在Ubuntu 8.04 Hardy上存储地理空间数据。 当buffer()在非常复杂的段上计算时,此特定版本的PostGIS存在一个错误,这会导致查询占用越来越多的内存,直到整个计算机陷入困境。 我正在寻找一种可以实现以下目的的PostgreSQL机制: 限制特定查询使用的内存消耗(可能还有其他资源)。 自动停止执行时间超过特定阈值的查询。 有任何想法吗?

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.