数据库管理员

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

2
带有多列的Postgres全文搜索,为什么在索引中而不是在运行时连接?
在过去的几天里,我在postgres中遇到了全文搜索,并且在跨多列搜索时对索引有些困惑。 postgres 文档讨论了如何ts_vector在串联列上创建索引,如下所示: CREATE INDEX pgweb_idx ON pgweb USING gin(to_tsvector('english', title || ' ' || body)); 我可以这样搜索: ... WHERE (to_tsvector('english', title||' '||body) @@ to_tsquery('english', 'foo')) 但是,如果我想有时仅搜索标题,有时仅搜索正文,有时两者都搜索,则需要3个单独的索引。如果我在第三列中添加了索引,则可能是6个索引,依此类推。 我在文档中没有看到的另一种方法是只是分别索引两列,然后使用普通WHERE...OR查询: ... WHERE (to_tsvector('english', title) @@ to_tsquery('english','foo')) OR (to_tsvector('english', body) @@ to_tsquery('english','foo')) 在大约一百万行中对这两个基准进行基准测试似乎在性能上基本没有区别。 所以我的问题是: 为什么我要连接这样的索引,而不是单独索引列?两者的优点/缺点是什么? 我最好的猜测是,如果我事先知道,我只想搜索两个列(一次不搜索),那么我只需要通过串联使用较少内存的一个索引。


1
计算列中使用的标量函数,更新函数的最干净方法是什么?
我想在我们的数据库中更新一个标量函数。该函数用于键表中的多个计算列,因此如果尝试更新它,则会出现依赖项错误。我可以显式删除列,更新函数并重新添加列,但是,如果没有很多多余的幻想,那将改变列顺序,并可能产生其他意想不到的后果。我想知道是否有一种更清洁的方法?

2
MySQL在创建表为SELECT时锁定
我正在运行以下(虚拟)查询 CREATE TABLE large_temp_table AS SELECT a.*, b.*, c.* FROM a LEFT JOIN b ON a.foo = b.foo LEFT JOIN c ON a.bar = c.bar 假设查询需要10分钟才能运行。在表a,b或c运行时尝试更新它的值将等待上面的查询首先完成。我想避免这种锁定(数据一致性不重要)。我该如何实现? 使用:MySQL 5.1.41和InnoDB表 ps SET事务隔离级别读取未提交;行为无变化 更新 在执行查询时,SHOW ENGINE INNODB STATUS的输出如下(我在这里故意进行了非常慢的查询) ===================================== 120323 15:26:29 INNODB MONITOR OUTPUT ===================================== Per second averages calculated from the last 8 …
10 mysql  locking  ctas 

3
为什么此完全外部联接不起作用?
我之前曾使用“完全外部联接”来获得所需的结果,但也许我不完全理解该概念,因为我无法完成应该是简单联接的工作。 我有2个表(分别称为t1和t2),每个表有2个字段: 11 Policy_Number Premium 101 15 102 7 103 10 108 25 111 3 t2 Policy_Number Loss 101 5 103 9 107 20 我想做的是从两个表以及Policy_Number中获得保险费和损失总和。我使用的代码是: select sum(premium) Prem_Sum, sum(Loss) Loss_Sum, t1.policynumber from t1 full outer join t2 on t1.policynumber = t2.policynumber group by t1.policynumber 上面的代码将返回正确的总和,但会将“ policy_number”下“ policy_number”不匹配的所有记录分组。 我希望我的结果看起来像这样 Policy_Number Prem_Sum …

2
100 TB容量数据库-资源和时间估计
我正在为100TB报告数据库设置进行“封底”计算。我正在从这里的专家那里寻找想法。建议环境: 储存容量〜100TB 表约200个,大小从1G​​B到5TB不等。平均大小可能在100GB-200GB之间 ETL-作业可能需要在10亿个行的表之间进行联接,联接键的范围从10字节到500字节。这样的加入应在2-5分钟内完成 实时选择-最初仅对选择速度感兴趣。应该支持500次选择/秒。“每秒更新数”相对较小,因此在本练习中可以忽略。 需要24x7的可用性。2个独立的DB服务器应可用于服务选择调用(复制数据)。 问题: 目前,我正在研究Oracle。您在大型数据库的其他商业(或)开源解决方案方面的经验如何? 您认为哪种硬件操作系统最有效?我正在计划在Dell上使用Linux。 网络存储(例如NetApp)是否必须?您预计使用现成的商用磁盘会有哪些问题? 硬件和操作系统准备就绪后,您将留出多少时间来设置,配置数据库,存储等。 在您观察到的环境中,哪种团队组成最有效?我的意思是,管理和操作此类设置所需的各种管理员(OS Admin,Oracle DB Admin?)。要实现24x7的正常运行时间,可能需要多少个。 数据库许可,网络存储成本的任何近似值/范围。 我知道我没有所有的环境细节。我不是在寻找确切的细节,一个近似值就足够了。尽管某些问题可能最好由经理回答,但我对Admins的观点很感兴趣。感谢您的投入。

1
有关SQL Server基准测试的明确步骤列表?
在为使用SQL Server的应用程序运行性能测试/基准之前,我希望能够将实例设置为“干净”状态,而无需重新启动实例。我倾向于遵循一些步骤,但是我想建立一个确定的列表,该列表的顺序正确,没有多余的步骤。 此步骤列表是否完成将SQL Server设置为“干净”状态? 顺序逻辑/正确吗? 有多余的步骤吗? CHECKPOINT -- Write all dirty pages DBCC DROPCLEANBUFFERS -- All should be clean after checkpoint? DBCC FREEPROCCACHE -- Clear the plan cache DBCC FREESYSTEMCACHE -- Is this necessary after FREEPROCCACHE? DBCC FREESESSIONCACHE -- May not be necessary if distributed queries aren't used, but want …


3
在表中插入数字时,如何保留前导零?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为数据库管理员Stack Exchange 的主题。 8年前关闭。 我已将两个记录插入到表中。 create table num(id int) insert into num values(0023) insert into num values(23) select * from num 当我查询它们时,它们都显示为23。这意味着SQL Server忽略前导0。其背后的机制是什么?在插入值时,SQL Server如何返回值(即0023和23)?

2
在Debian上对单个MySQL查询使用多个内核
我正在将MySQL服务器运行在Debian作为来宾OS的VM(VMWare)上进行测试。来宾系统具有四个模拟的CPU内核,因此我将thread_concurrency设置为四个。 我正在大型表上进行昂贵的联接,这可能需要花费几分钟,但是我在客户机操作系统上看到,一次只使用一个核心。无论涉及的表使用了什么存储引擎(都已通过MyISAM和InnoDB测试),都会发生这种情况。另外,在执行这些大查询时,整个数据库似乎被阻塞,我无法并行执行任何其他查询。奇怪的是,htop显示,查询的核心在查询运行期间发生了变化! 为什么会这样? 这是来自的相关条目SHOW FULL PROCESSLIST;(没有其他查询): | 153 | root | localhost | pulse_stocks | Query | 50 | Copying to tmp table | SELECT DISTINCT * FROM `pulse_stocks`.`stocks` sto, `pulse_new`.`security` sec WHERE (sto.excntry = sec.excntry AND sto.stock_id = sec.ibtic) OR ( sto.isin = sec.isin AND sto.isin <> "" AND …

2
非聚集索引插入
说我有一张这样的桌子: create table SomeTable ( id int identity(1, 1) not null primary key clustered, SomeString1 varchar(50) not null, SomeString2 varchar(50) not null ) go create nonclustered index IX_SomeString1 on SomeTable(SomeString1) go 如果我要这样做: insert into SomeTable(SomeString1, SomeString2) values('foo', 'bar') go 并且查看实际的执行计划,我只看到一个聚集索引插入。为什么在执行计划中看不到非聚集索引插入?
10 sql-server 

3
库存项目具有不同属性时的库存数据库结构
我正在建立一个库存数据库来存储企业硬件信息。数据库跟踪的设备范围从工作站,便携式计算机,交换机,路由器,移动电话等开始。我使用设备序列号作为主键。我遇到的问题是这些设备的其他属性各不相同,并且我不希望清单表中的字段与其他设备无关。下面是数据库部分ERD的链接(未显示某些FK关系)。例如,我正在尝试进行设置,因此无法将具有工作站设备类型的设备放入手机表中。这似乎需要使用许多触发器来验证设备类型或类,并且只要有不同属性的不同设备被跟踪,就可以创建新表。 我研究了设置可以映射到序列号的属性表,但是这将允许将不适用于设备类型的属性分配给设备,例如,有人可以根据需要将电话号码属性分配给工作站。我在此站点上找到了一个解释,该解释给出了以下结构: 如果属性都适用于我要存储的项目,则此结构将非常有用。例如,如果数据库仅存储手机,则属性可以是诸如触摸屏,触控板,键盘,4G,3G ...之类的东西。在这种情况下,它们都适用于电话。我的数据库将具有诸如主机名,circuitType,phoneNumber之类的属性,这些属性仅适用于特定类型的设备。 我要进行设置,以便仅将适用于给定设备类型的属性分配给该类型的设备。关于如何设置此数据库的任何建议?我不确定这是否是一对一关系的正确使用,还是有更好的方法来做到这一点。预先感谢您抽出宝贵的时间对此进行研究。 这是我阅读的其他一些主题。他们给了我一些很好的见解,但我认为它们并不适用: /programming/9335548/how-to-structure-database-for-inventory-of-unlike-items /programming/1249632/database-structure-for-items-with-varying-attributes /programming/5559587/product-inventory-with-multiple-attributes /programming/6613802/question-about-setting-up-inventory-database /programming/514111/how-to-best-represent-items-with-variable-of-attributes-in-a-database


6
SQL Server是否并行执行查询?
SQL Server是否并行执行查询?换句话说,如果我运行一个耗时10秒的繁重查询,并且同时启动另一个耗时10秒的繁重查询,则第二个查询实际上会在10秒后启动,还是它们会同时启动?
10 sql-server 

2
是否可以通过SQL Server 2008强制索引保留在内存中?
我有一个包含几百万行的表,我需要不时地从中运行一些查询。第一次查询通常会很慢(大约10s),而后续查询通常会更快(大约1s)。几个小时后,缓慢/快速循环又开始了。 我已经在执行计划中检查了所有需要的索引均已存在并已正确使用,并且我认为性能差异是由于该索引实际上位于后续查询的内存中(我是对的,还是其他?可能的原因?) 我还使用索引来运行许多其他查询,但是这些查询耗时较少,其性能也不太关键,因此我担心那些索引实际上会将关键索引从内存缓存中推出。 除了明显的“添加更多RAM”修复程序之外,我还一直在考虑编写脚本脚本以每小时运行一次以将索引强制返回内存。 有没有更优雅的方法可以做到这一点?就像一种提示SQLServer的方法一样,如果它只有足够的内存来保持单个索引的高速缓存,那它应该是那个? 我知道通常最好的办法是不要将SQLServer与这类事情搞混,但是我查询的异常性质(运行很少,但是时间紧迫)使我相信这样做(如果可能) 。 我也很好奇,是否有办法知道给定时间在内存中缓存了哪些索引?

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.