数据库管理员

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

2
MySQL:delete…where..in()vs delete..from..join,并使用subselect锁定删除表
免责声明:请原谅我缺乏数据库内部知识。它去了: 我们运行的应用程序(不是我们编写的)在数据库的定期清理作业中存在很大的性能问题。查询如下所示: delete from VARIABLE_SUBSTITUTION where BUILDRESULTSUMMARY_ID in ( select BUILDRESULTSUMMARY_ID from BUILDRESULTSUMMARY where BUILDRESULTSUMMARY.BUILD_KEY = "BAM-1"); 直截了当,易于阅读和标准SQL。但不幸的是非常缓慢。对查询进行解释说明VARIABLE_SUBSTITUTION.BUILDRESULTSUMMARY_ID未使用现有索引on : mysql> explain delete from VARIABLE_SUBSTITUTION where BUILDRESULTSUMMARY_ID in ( -> select BUILDRESULTSUMMARY_ID from BUILDRESULTSUMMARY -> where BUILDRESULTSUMMARY.BUILD_KEY = "BAM-1"); | id | select_type | table | type | possible_keys | key …


1
如何判断备份文件是否包含CDC?
使用SQL Server 2008到2014年,我知道如何在启用更改数据捕获(CDC)的情况下备份和还原数据库,但是我正在寻找一种查询完整备份文件以确定其是否包含CDC数据的方法。 最好的办法是RESTORE FILELISTONLY从数据库获取文件列表,但获取CDC状态以确定还原是否需要使用KEEP_CDC标志? 有没有办法确定备份是否包含CDC数据? 谢谢!

1
PostgreSQL bytea与smallint []
我希望将大型(100Mb-1 GB)多通道时间序列数据导入PostgreSQL数据库。数据来自EDF格式文件,该文件将数据分块为通常每个几秒钟的“记录”或“纪元”。每个时期的记录将每个数据通道的信号保存为短整数的连续数组。 我被授权将文件存储在数据库中,在最坏的情况下,存储为BLOB。鉴于此,我想研究一些选项,这些选项将使我可以对数据库中的数据做更多的事情,例如,促进基于信号数据的查询。 我最初的计划是将每个纪元记录的数据存储为一行。我要权衡的是将实际信号数据存储为bytea还是smallint [](甚至是smallint [] [])类型。谁能推荐一个?我对存储和访问成本感兴趣。用法可能只插入一次,偶尔读取,就永远不会更新。如果更容易将其包装为自定义类型,以便我可以添加用于分析比较记录的函数,那就更好了。 毫无疑问,我的细节不够完善,请随时添加您要我澄清的内容的评论。


3
获取MS SQL Server释放磁盘空间
管理不善的数据库表已经变得非常庞大。48个以上的孤儿记录。我正在尝试清理它并将危险的满硬盘驱动器恢复到正常状态。我将从该表中删除大约4亿条记录。当我键入时,它正在运行。我注意到我的硬盘驱动器空间没有减少,但是系统表查询的内存减少了,我正在运行以获取表大小。该数据库正在使用“简单恢复模型”。 有许多与此类似的问题,有答复说您需要缩小数据库。但是他们继续解释由于数据等的分散,这样做是多么的糟糕/可怕。 由于数据库不应该具有此大小。缩小它仍然对我有害吗? 这是一个生产数据库。如果缩小,会导致停机或锁定数据库吗? 在SQL Server Management Studio中,您有两个选项用于收缩,数据库或文件。根据我的情况,最好的选择是什么? 数据库应具有的可用空间百分比是否有规定? 即使阅读了shrink的标签说明,我也不想这样做。还有另一种方法吗?

2
在单个SELECT语句中返回多个范围的计数
我有一个Postgres数据库表foo,除其他外,该表的列score介于0到10之间。我希望查询返回总得分数,0到3之间的得分数,4之间的得分数和6,分数在7到10之间。类似以下内容: SELECT COUNT(*) as total, COUNT( SELECT * from foo where score between 0 and 3; ) as low, COUNT( SELECT * from foo where score between 4 and 6; ) as mid, COUNT( SELECT * from foo where score between 7 and 10; ) as high FROM foo; 我想这一点,但与得到一个错误SELECT的COUNT语句。有什么想法可以做到吗?我敢肯定Postgres中有一种超级简单的方法。我只是想不出正确的字词给Google。

5
两个SQL语句的数学相等性
有没有办法检查两个SQL语句的数学相等性? 我有两个SQL语句: SQL_STATEMENT_1 SQL_STATEMENT_2 对数据运行两个语句并比较输出完全没有帮助。 像方程求解器一样,需要评估语句后的集合数学。 我的问题超出范围是: 比较等于,然后等于(大于,小于,等于...) 存储过程或触发器 公用表表达式(WITH) 在范围内: 子选择:WHERE other_id IN(从其他WHERE中选择ID ...) 加盟

5
根据先前和实际的行值计算行值
大家好,谢谢您的帮助。 我遇到以下情况:称为语句的表,其中包含字段id(int),stmnt_date(date),借方(double),贷方(double)和余额(double) 我想按照以下规则计算余额: 第一行余额(按时间顺序)=借方-贷方,其余各行 当前行余额=按时间顺序上一个行余额+当前行借方-当前行贷方 正如您在上面的图片中看到的,行没有按日期排列,这就是为什么我按时间顺序两次使用单词来强调stmnt_date值的重要性的原因。 非常感谢您的帮助。
9 mysql  row 

1
无法还原(错误3456)
我的情况不容易弄清楚,以为我会在这个论坛上问其他人是否有建议。 我正在Windows Server 2008R2 Enterprise上运行SQL Server 2008 R2 Standard SP3。 数据库需要一些维护,事实上,我需要在另一台服务器上进行还原。我使用COPY_ONLY进行了完整的数据库备份,再加上一组4个日志备份。 在开始之前,创建tlogbackup1 从转换FULL为BULK_LOGGED恢复模式 添加新文件组 将文件添加到newfilegroup 将newfilegroup设置为默认 选择进入表(在newfilegroup上) 放下原始表 删除原始文件 删除原始文件组 更改新表的名称以匹配原始表 更改newfilegroup的文件名以匹配原始文件组 更改目录中的文件名以匹配原始文件名 在操作系统级别更改文件名以匹配原始文件名 将默认文件组设置为原始文件组 使数据库联机 从转换BULK_LOGGED为FULL恢复模式 完成所有步骤后,创建tlogbackup2 由于还原服务器上驱动器号的更改,所有备份的还原必须使用WITH MOVE。 恢复步骤: RESTORE database SomeDB FROM DISK = 'D:\REPRO\SomeDB.bak' WITH MOVE 'SystemData' TO 'D:\SQLDATA\SomeDB.mdf' ,MOVE 'SystemDataPDS' TO 'D:\SqlData\SomeDB.ndf' ,MOVE 'SystemData_log' TO …

1
如何查看完整的阻止postgres查询?
我正在使用此页面上的语句来查看Postgres中的阻塞查询 SELECT bl.pid AS blocked_pid, a.usename AS blocked_user, ka.query AS blocking_statement, now() - ka.query_start AS blocking_duration, kl.pid AS blocking_pid, ka.usename AS blocking_user, a.query AS blocked_statement, now() - a.query_start AS blocked_duration FROM pg_catalog.pg_locks bl JOIN pg_catalog.pg_stat_activity a ON a.pid = bl.pid JOIN pg_catalog.pg_locks kl ON kl.transactionid = bl.transactionid AND kl.pid != …

2
在Postgres中拥有成千上万的用户可行吗?
我们正在创建SAAS,最多将有50.000个客户。我们正在考虑在Postgres数据库中为每个客户创建一个用户。我们将每个登录我们服务的用户映射到数据库中的一个用户,以确保他们只能访问自己的数据。我们还希望通过此解决方案在触发器中直接在数据库中实现审计跟踪。如果每个客户都有自己的数据库用户,那么即使两个客户共享相同的数据,也很容易看到谁做了什么。 因为我们的数据库中有50.000个用户,我们是否会遇到一些意外问题?绩效方面或管理方面。也许连接池会更困难,但是我真的不知道我们是否需要它。

2
Page Life Expectancy对实例有何看法?
我已经在环境中的一些SQL Server实例上安装了监视软件。我正在尝试查找瓶颈并解决一些性能问题。我想找出某些服务器是否需要更多内存。 我对一个计数器感兴趣:页面预期寿命。在每台机器上看起来都不同。为什么在某些情况下经常更改,这意味着什么? 请查看上周在不同计算机上收集的数据。您能对每个实例说些什么? 大量使用的生产实例(1): 适度使用的生产方式(2) 很少使用的测试实例(3) 大量使用的生产实例(4) 中度使用的测试实例(5) 大量使用的数据仓库(6) 编辑:我为所有这些服务器添加SELECT @@ VERSION的输出: Instance 1: Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) Jun 17 2011 00:54:03 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor) Instance 2: Microsoft SQL …

1
使用xml参数更新多个数据时,如何避免使用合并查询?
我正在尝试使用值数组更新表。数组中的每个项目都包含与SQL Server数据库中的表中的一行相匹配的信息。如果表中已经存在该行,则使用给定数组中的信息更新该行。否则,我们在表中插入新行。我已经基本描述了upsert。 现在,我试图在采用XML参数的存储过程中实现这一目标。我使用XML而不是表值参数的原因是因为这样做,我将不得不在SQL中创建自定义类型并将该类型与存储过程相关联。如果我曾经更改过存储过程或数据库模式中的某些内容,则必须重做存储过程和自定义类型。我想避免这种情况。此外,TVP优于XML的优势对我的情况没有用,因为我的数据数组大小永远不会超过1000。这意味着我无法使用此处提出的解决方案:如何在SQL Server 2008中使用XML插入多个记录 另外,这里的类似讨论(UPSERT-MERGE或@@ rowcount是否有更好的替代方法?)与我要的内容有所不同,因为我试图将多行插入表中。 我希望我可以简单地使用以下查询集从xml向上插入值。但这是行不通的。仅当输入为单行时,才应采用这种方法。 begin tran update table with (serializable) set select * from xml_param where key = @key if @@rowcount = 0 begin insert table (key, ...) values (@key,..) end commit tran 下一个替代方法是使用穷举的IF EXISTS或其以下形式的变体之一。但是,我以效率不佳为由拒绝了这一点: IF (SELECT COUNT ... ) > 0 UPDATE ELSE INSERT 下一个选择是使用Merge语句,如下所述:http …

2
简单的删除,但是复杂的执行计划
当我运行此删除时: DELETE FROM ETLHeaders WHERE ETLHeaderID < 32465870 ...它删除39,157行。它应该很简单,因为它是在ETLHeaderID上删除的,而ETLHeaderID是聚簇索引和主键。但是(根据执行计划)它似乎达到361,190行并使用其他索引。该表确实具有XML数据类型的字段(以防影响此DELETE)。 有任何想法为何以及如何加快此DELETE? 这里的执行计划: http ://sharetext.org/qwDY这里的表模式:http : //sharetext.org/Vl9j 谢谢

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.