数据库管理员

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

1
如何以线程安全的方式查询和增加值(计数器)?(避免比赛条件)
在每行有一个计数器(只是一个整数值)的表,我需要的电流值,并增加它在同一时间。 实际上,我想这样做: SELECT counter FROM table WHERE id=123 UPDATE table SET counter=counter+1 WHERE id=123 但是,作为两个查询执行此操作显然不是线程安全的:执行相同操作(在同一行上)的多个进程可能会获得相同的计数器值。我需要它们全部都是唯一的,因此每个过程都将获得实际的当前值并将其增加一个。 我可以想到一种在每行实现一个手动锁的构造,但是我想知道是否有更简单的方法可以做到这一点?
10 mysql  locking 

2
PostgreSQL是否优化添加具有非NULL默认值的列?
在添加NOT NULL带有DEFAULT值的列时-PostgreSQL是否优化了此操作? 如果表有n行,那么未优化的alter-table-add-column将产生默认值的n次写入-显然,这很痛苦。通过优化,数据库将立即创建新列,仅存储默认值的一个副本,当在合适的索引数据结构中找不到该列的非默认值时将返回该默认值。 例如,Oracle 11g进行了这样的优化。

2
PostgreSQL中复合索引中的列顺序(和查询顺序)
我有一张有5万行的表格。它实际上是一个PostGIS表。 该查询分为4个部分(1个必填项)(3个可选) 长4纬度(我使用st_intersects)的相交箱(地理矩形)[必须] 日期字段上的日期范围(最小,最大) 当前使用IN(.....)的文件类型(最多8个文本值的集合),但是如果需要,我可以将其设为临时表。我看到很多人不喜欢IN。 国家(文本值)。 我预计将返回约100-4,000行 如果在表上创建复合索引,则应首先使用哪一列。细粒度可能是位置(数据分布在世界各地)。我目前将其作为GIST索引。 其他索引将是BTREE。 我的直觉说,使用细颗粒,最后选择。例如,只有大约12种文件类型,因此对于索引而言这将是非常大的存储桶。 PostgreSQL和PostGIS专家(谁知道系统的内部结构)怎么说? 更新: 让我提出这个问题。 我不希望任何人必须做我应该做的工作。我非常尊重您的时间。因此我将在后面进行解释分析。 我所寻找的只是一些指示,技巧和指南。 我阅读了这篇出色的小文章:https : //devcenter.heroku.com/articles/postgresql-indexes#managing-and-maintaining-indexes关于索引 我通常要做的是创建4个单独的索引(地理框,国家/地区名称,file_type和日期),但是要查看复合查询的作用。 告诉我这些假设是否有误。(我对复合索引的想法很陌生) 顺序很重要。选择最能减少行数的索引作为第一个索引(在我的情况下,简单的多边形或多多边形的位置(地理位置)将是最好的)。 有时查询会跳过索引。但是,如果我使用键(#1,#2,#3,#4)创建了一个复合查询,那么即使用户创建了要求#1,#3的内容,计划者仍会使用单个复合查询,因为他们要订购被维持。 通常,我将创建三个BTREE查询和一个GIST(针对地理位置类型)。PostGIS不支持从多个索引类型创建复合。因此,我将不得不使用GIST复合索引。但这不应该伤害任何事情。 如果我确实创建了其他一些复合或单值索引,则计划程序足够聪明,可以选择最聪明的一个。 国家/地区名称可以有大约250个不同的值,并且显然与位置(地理框)紧密相关,但是如果要减小行大小的下一个最佳索引是file_type,我应该在下一个使用。我不希望用户在他们的查询集中经常使用国家或日期。 我不必担心创建4个键的复合索引会大大增加索引数据的大小。即,如果一键索引将是性能提升的90%,那么再添加3项使其复利也不会有什么坏处。相反,我应该真正创建两个索引。一个单一的地理索引,还有一个复合索引,然后让计划者确定哪一个是最佳的,并且它将考虑索引表的大小。 再说一次,我不是要任何人来设计我的解决方案,也不是要别人的工作。但是我确实需要PostGreSQL文档不会告诉我有关实现的内容 [我没有显示EXPLAIN结果的原因是,我必须从24M行表中创建此25K行表。这比我想象的要花费更多的时间。我将事物分为1,000个项目组,并让用户针对25K行表进行查询。但是,我的下一个问题将涉及使用该查询的结果转到MASTER 25M行表并提取内容,这就是复合索引的性能真正达到HIT的位置。 下面的示例查询: SELECT public.product_list_meta_mv.cntry_name AS country, public.product_list_meta_mv.product_producer AS producer, public.product_list_meta_mv.product_name AS prod_name, public.product_list_meta_mv.product_type AS ptype, public.product_list_meta_mv.product_size AS size, ST_AsGeoJSON(public.product_list_meta_mv.the_geom, 10, 2) AS …

2
如何动态别名列?
我有一个表(不是我自己设计的),其中有20个变量命名的列。也就是说,根据您要查看的记录类型,该列的适用名称可以更改。 可能的列名存储在另一个表中,我可以很容易地查询它。 因此,我真正要查询的查询是这样的: SELECT Col1 AS (SELECT ColName FROM Names WHERE ColNum = 1 and Type = @Type), Col2 AS (SELECT ColName FROM Names WHERE ColNum = 2 and Type = @Type) FROM Tbl1 WHERE Type = @Type 显然这是行不通的,那么如何获得类似的结果? ' 我已经尝试构建查询字符串并EXECUTE对其进行查询,但这仅返回“命令已成功完成”,并且似乎未返回行集。 事实证明,我使用了不正确的查询来构建动态SQL,因此构建了一个空字符串。SQL Server肯定正确执行了空字符串。 请注意,我之所以需要这样做,而不是简单地对列名进行硬编码,是因为列名是用户可配置的。

5
如何确定最佳sort_buffer_size?
我从一个示例配置文件中读取内容,该文件显示以下内容: # Sort buffer is used to perform sorts for some ORDER BY and GROUP BY # queries. If sorted data does not fit into the sort buffer, a disk # based merge sort is used instead - See the "Sort_merge_passes" # status variable. Allocated per thread if sort is …

1
在数据库项目中将链接服务器与OPENQUERY一起使用
我有一个SQL Server 2008,运行一个我想放入TFS的数据库。因此,我在导入数据库的地方使用了Visual Studio 2013数据库项目。修复了一堆错误之后,我只剩下一个错误: 在一个视图中,开发人员用来OPENQUERY访问链接服务器。因此,我导入了包含正确数据库的DACPAC,并Add Database Reference使用以下参考选项将其添加到项目中。 初始脚本版本 这是原始视图创建的简短版本: CREATE VIEW dbo.vwStatus AS SELECT StatusID, StatusName FROM OPENQUERY(LinkedServer, 'SELECT * FROM [DB].[dbo].tbStatus') AS derivedtbl_1 这导致以下错误: 错误136 SQL71501:视图:[dbo]。[vwStatus]具有对对象[LinkedServer]的未解析的引用。 第一次尝试 所以我试图插入服务器名称变量 FROM OPENQUERY($(LinkedServer), 'SELECT * FROM [DB].[dbo].tbStatus') AS derivedtbl_1 这导致 错误176 SQL46010:$(LinkedServer)附近的语法不正确。 进一步尝试 我摆弄了arround并尝试了以下操作(启用和不启用引用标识符): FROM OPENQUERY("$(LinkedServer)", 'SELECT * FROM [DB].[dbo].tbStatus') AS …

1
加强约束“两张桌子”
我在用SQL建模电气原理图时遇到了一些麻烦。我想捕捉的结构是 part ←────────── pin ↑ ↑ part_inst ←───── pin_inst 其中“实例”是“实例”的缩写。 例如,作为partLM358运算放大器,我可能具有pins 1OUT,1IN-,1IN +,GND,2IN +,2IN-,2OUT和V CC。然后,我可能将此零件放在原理图上,并创建一个part_inst和8 pin_insts。 忽略数据字段,我最初对模式的尝试是 create table parts ( part_id bigserial primary key ); create table pins ( pin_id bigserial primary key, part_id bigint not null references parts ); create table part_insts ( part_inst_id bigserial primary key, part_id …

4
有没有一种快速的方法来查找SQL Server 2008 R2中所有已加密/已加密数据的列?
有没有一种快速的方法来查找SQL Server 2008 R2中所有已加密/已加密数据的列? 我需要使开发服务器中所有加密列中的数据无效(根据我们的业务规则)。我知道大多数专栏是因为我们经常使用它们,但是我想透彻一点,也希望能够证明已经找到了所有专栏。 我已经在网上搜索,查看了INFORMATION_SCHEMA并检查了我认为有用的DMV以及sys.columns和sys.objects,但是到目前为止还算不上什么。

1
MySql Server性能下降-什么以及如何检查?
开始:免责声明 我不是MySql Server DBA;我最了解MSSQL-这就是为什么我需要您的帮助。 结束:免责声明 我被要求检查为什么MySql服务器引擎的性能不佳-我没有看到也没有保存所涉及的数据库,并且想知道从哪里开始。 我从哪里开始? 我应该问哪些问题来访问MySql的人员-我什至不知道他们是否使用phpmyadmin或其他工具。 实质上: 我需要什么物品,我将如何回应每件物品? 问题出在数据库性能上时,有哪些关键要求? 在MSSQL中,我可以检查sp_who2现有连接以查看是否有阻塞,mysql中的对应对象是什么?*不必太具体,因为每个项目可能有多种结果,但是由于它影响用户,因此希望帮助解决问题-显然他们在没有dba的情况下设置了mysql引擎。

3
如何在SSRS报告中隐藏行?
我想弄清楚如何在报表中隐藏那些行,其中SSRS 2008中“两列中的总分配和总成本”为0。 例如: 总分配总实际成本 0 0 <----隐藏 100,00 0 <----不要隐藏 0 50,0000 <----不要隐藏 这是屏幕截图: 谢谢

3
如何创建带有使用序列的列的表?
我有以下 CREATE TABLE [MyTable] ( [ID] [bigint] PRIMARY KEY NOT NULL, [Title] [nvarchar](64) NOT NULL ) CREATE SEQUENCE MyTableID START WITH 1 INCREMENT BY 1 NO CACHE ; GO 我想在MyTable上插入新记录,并将ID设置为序列的下一个值。我该怎么做?触发,或者还有其他方法吗?怎么样? 当我使用SQL Server 2012时,由于gap bug,我不想使用身份。

1
嵌套在OUTER JOIN内部的INNER JOIN语法与查询结果
TLDR;如果您查看这两个执行计划,有一个简单的答案是哪个更好?我故意没有创建索引,因此更容易看到正在发生的事情。 在我之前的问题(我们发现不同的联接样式(即嵌套与传统)之间的查询性能差异)进行了跟进之后,我意识到嵌套语法也可以修改查询的行为。考虑以下两个查询。 SELECT a.*, m.*, n.* FROM dbo.Autos a LEFT JOIN dbo.Models m JOIN dbo.Manufacturers n -- <-- Nested INNER JOIN ON n.ManufacturerID = m.ManufacturerID ON m.ModelID = a.ModelID 这并不一定使制造商加入,以包括与ModelID自动行是不是在型号表。 使用传统语法,我们必须将Manufactures的联接更改为外部联接,就像这样……但这会更改查询计划。 SELECT a.*, m.*, n.* FROM dbo.Autos a LEFT JOIN dbo.Models m ON m.ModelID = a.ModelID LEFT JOIN dbo.Manufacturers n …

2
从数据库属性对话框的“文件”页面更改数据库所有权时出错
我已还原数据库,并以db_owner的身份创建了一个新用户(与我登录时使用的用户相同)。现在,当我想查看数据库图时出现错误 无法安装数据库图支持对象,因为该数据库没有有效的所有者。要继续,请首先使用“数据库属性”对话框的“文件”页面或“更改授权”语句将数据库所有者设置为有效的登录名,然后添加数据库支持对象 现在,当我尝试从数据库属性的“文件”页面更改所有权时,出现以下错误: Set Owner因数据库'ABC'失败。(Microsoft.SqlServer.SMO)其他信息:SMO中发生异常建议的新数据库所有者James-PC \ James被映射为该数据库中的用户James。参数名称:James-PC \ James“ 请帮助我解决此问题,以便从另一个系统还原数据库备份后,可以在这台计算机上查看数据库图。

2
在mysql中启用LOAD DATA LOCAL INFILE
LOAD DATA LOCAL INFILE默认情况下未启用。通常,应通过放置local-infile=1在中来启用它my.cnf。但这并不适用于所有安装。以我的经验,尽管这两个安装都来自相同的预编译deb软件包,但它仅适用于Debian 7 minimal。两者都在OpenVZ VPS上。 如何调试为什么local-infile=1对安装无效,以及如何安全激活LOAD DATA LOCAL INFILE?

2
将DBCC CHECKDB划分为多天
我正在实施Paul Randal的方法,以针对大型数据库在几天内手动分布DBCC CHECKDB,该方法主要包括: 在7个存储桶之间大致平均地划分数据库中的表 每周运行一次DBCC CHECKALLOC 每周运行一次DBCC CHECKCATALOG 每周每天在一个存储桶上运行DBCC CHECKTABLE 有人使用过这种技术吗?有没有现有的脚本? 我担心这可能无法涵盖CHECKDB所做的一切;CHECKDB的联机丛书文档说,除了CHECKALLOC,CHECKCATALOG和CHECKTABLE外,它还: 验证数据库中每个索引视图的内容。 使用FILESTREAM将varbinary(max)数据存储在文件系统中时,验证表元数据与文件系统目录和文件之间的链接级一致性。(仅适用于SQL 2008) 验证数据库中的Service Broker数据。 所以这是我的问题: 这些额外检查是否必要/重要?(索引视图可能与我有关,我认为我们还没有使用Service Broker或FILESTREAM。) 如果是这样,是否有办法分别执行这些附加检查? CHECKALLOC和CHECKCATALOG似乎运行非常快,即使在大型数据库上也是如此。有什么理由不每天运行这些? (注意:这将是数百个服务器中成千上万个现有数据库的标准例程,或者至少是一定规模的每个数据库的标准例程。这意味着诸如重组所有数据库以使用CHECKFILEGROUP之类的选项对我们而言并不实际。)

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.