数据库管理员

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

1
在PostgreSQL 8.3上备份并在PostgreSQL 9.4中还原后,数据库大小减小了
我pg_dump在托管在PostgreSQL 8.3服务器上的JIRA数据库上进行了操作。之后的数据库大小vacuum full为217132652(大约207 MB)。 然后,我使用以下命令在PostgreSQL 9.4服务器上还原了JIRA数据库: $ psql -X -v ON_ERROR_STOP=1 -d jira2 -U jira -h localhost < jiradb2017_03_12.sql 我假设自从使用以来,还原将在发生任何错误时退出ON_ERROR_STOP=1,但是SQL脚本正确完成了(尽管有些警告与数据还原无关)。 我最终得到了一个大小为158019348(大约151 MB)的数据库。 那么,这是什么故事呢?我是否可以仅假设数据库已成功恢复并且PostgreSQL优化了其存储引擎(介于8.3和9.4版本之间),并且正在更有效地利用空间?

1
PostgreSQL / PostGIS 9.6打破了我的复合索引
在PostgreSQL 9.2中,我创建一个具有地理(postGIS)类型和整数作为复合索引的索引没有问题。但是现在(9.6)它抱怨创建索引,我不明白它提供的提示: 列和数据均已正确创建,Postgres抱怨创建索引。 ERROR: data type integer has no default operator class for access method "gist" HINT: You must specify an operator class for the index or define a default operator class for the data type. ********** Error********** ERROR: data type integer has no default operator class for access method …

2
在单独的数据库之间建立关系是不好的做法吗?
我正在与一个具有多个数据库的客户端一起工作。有多个master级别数据库,这些级别数据库具有从instance级别数据库(特定于应用程序的DB)返回的关系。从instance到的关系master是整数值,代表.NET中表的主键master。设置中的视图和存储过程以通过这些存储的键instances从中加载数据master。 显然,没有真正的参照完整性,但是这是一种不好的做法还是应该将数据驻留在instance数据库的只读表中?

5
使用窗口功能优化子查询
由于我的性能调优技能似乎永远不足,我一直想知道是否可以针对某些查询执行更多优化。这个问题涉及的情况是嵌套在子查询中的Windowed MAX函数。 我正在挖掘的数据是在较大组的各个不同组上的一系列事务。我有4个重要字段,一个事务的唯一ID,一批事务的Group ID以及与相应的唯一事务或一组事务相关的日期。多数情况下,组日期与批次的最大唯一交易日期相匹配,但是有时会通过我们的系统进行手动调整,并且在捕获组交易日期之后会进行唯一日期操作。此手动编辑不会通过设计来调整组日期。 我在此查询中识别的是那些唯一日期落在组日期之后的记录。以下示例查询建立了与我的场景大致相当的内容,并且SELECT语句返回了我要查找的记录,但是,我是否以最有效的方式来实现此解决方案?在我的事实表加载期间,这需要花一些时间,因为我的记录计数前9位数字,但是主要是我对子查询的鄙视使我怀疑这里是否有更好的方法。我不太担心任何索引,因为我相信它们已经存在。我正在寻找的是一种替代查询方法,该方法可以实现相同的功能,但效率更高。欢迎任何反馈。 CREATE TABLE #Example ( UniqueID INT IDENTITY(1,1) , GroupID INT , GroupDate DATETIME , UniqueDate DATETIME ) CREATE CLUSTERED INDEX [CX_1] ON [#Example] ( [UniqueID] ASC ) SET NOCOUNT ON --Populate some test data DECLARE @i INT = 0, @j INT = 5, @UniqueDate DATETIME, …

1
奇异的密度导致抽样统计
通过采样与全扫描进行估算时,NC指数获得完全不同的统计分布;采样的样本具有奇异的密度向量。这导致执行计划不佳。 我有一个约2700万行的表,并且非聚集索引支持一个非null的FK列。该表聚集在其主键上。两列都是varchar。 FK列的全扫描统计信息更新给出了正常外观的密度矢量: All density Average Length Columns 6,181983E-08 45,99747 INSTANCEELEMENTID 3,615442E-08 95,26874 INSTANCEELEMENTID, ID 也就是说,我们希望与之INSTANCELEMENTID连接的每个不重复读取约1.7行。 直方图中的典型bin如下所示: RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS FOOBAR 133053 10 71366 1,679318 但是,如果我们进行了抽样更新(使用此表的默认样本数为23万行),那么情况就变得奇怪了: 4,773657E-06 45,99596 INSTANCEELEMENTID 3,702179E-08 95,30183 INSTANCEELEMENTID, ID 现在的密度INSTANCEELEMENTID要大两个数量级。(但是,两根色谱柱的密度均已估算为可以接受的值)。 现在,直方图中的典型bin如下所示: RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS FOOBAR 143870,4 766,2573 1247 115,3596 ZOTZOT 131560,7 1 …

5
快捷方式/摘录以选择代码块
我在Windows 10上使用SQL Server Management Studio2016。我厌倦了使用shift / ctrl +上/下/右/左键选择要运行的代码。我想知道是否有快捷方式/代码段来选择用空白行与其他代码隔开的代码块? 这是一个代码示例: select * from tab1 select * from tab2 select * from tab3 说,我的光标在中间块内,选择中间块的最佳方法是什么?
8 ssms 

4
“ AlwaysOn”不总是“ Always On”吗?
我们创建了Windows故障转移群集,然后添加了两个SQL Server实例作为SQL Server故障转移群集的节点。 我们在SQL Configuration Manager中将服务器设置为使用“ AlwaysOn可用性组”。 为了测试故障转移,我加载并运行了一个长查询,然后通过使用故障转移群集管理器停止活动节点上的群集服务来关闭活动节点。 查询在没有连接的情况下中断,服务器在节点耗尽并新节点接管之前的20秒钟内显示为不可用。 我做错了吗?我应该如何配置它,以确保几乎没有连接丢失? AlwaysOn是否不总是开启?

2
为什么在BIGINT col上进行此搜索具有额外的常量扫描,计算标量和嵌套循环运算符?
当我查看某些查询的实际执行计划时,我注意到WHERE子句中使用的文字常量显示为计算标量和常量扫描的嵌套链。 要重现此,我使用下表 CREATE TABLE Table1 ( [col1] [bigint] NOT NULL, [col2] [varchar](50) NULL, [col3] [char](200) NULL ) CREATE NONCLUSTERED INDEX IX_Table1 ON Table1 (col1 ASC) 其中包含一些数据: INSERT INTO Table1(col1) VALUES (1),(2),(3), (-9223372036854775808), (9223372036854775807), (2147483647),(-2147483648) 当我运行以下(废话)查询时: SELECT a.col1, a.col2 FROM Table1 a, Table1 b WHERE b.col1 > 2147483648 我看到它将在Index Seek和标量计算(根据常量)的结果中进行嵌套循环绘制。 请注意,文字大于maxint。它确实有助于写作CAST(2147483648 …

2
pg_trigger_depth()是否可用于防止触发级联(递归)?
为什么pg_trigger_depth() = 0在防止触发级联(递归)时不好用(除调试外)? 有人可以提供代码来证明它为什么不好吗? 我正在猜测,因为如果多个触发器同时在同一数据上运行,则使用触发器停止的条件pg_trigger_depth() = 0将停止第二行执行的任何触发器。 我认为这将是解决这个问题的好方法,但有人告诉我: 在触发器内,是否有方法可以判断更新或插入是否来自触发器? 认为这将是一个很好的问题。 它在这里提供作为解决方案: 防止PostgreSQL中的递归触发器 Postgres 9.3文档: https://www.postgresql.org/docs/9.3/static/functions-info.html

3
无法插入到新创建的列中
我有一个像这样的简单测试表: CREATE TABLE MyTable (x INT); 在事务中,我尝试添加一列,然后插入到新创建的列中: BEGIN TRANSACTION; PRINT 'Adding column, ''SupplementalDividends'', to MyTable table.'; ALTER TABLE MyTable ADD SupplementalDividends DECIMAL(18,6); PRINT 'Column added successfully....'; PRINT 'Ready to INSERT into MyTable ...'; INSERT INTO MyTable (x, SupplementalDividends) VALUES (1, 3.2); PRINT '**** CHANGES COMPLETE -- COMMITTING.'; COMMIT TRANSACTION; 当我运行上面的代码时,问题是一条错误消息: …

1
从JSON对象创建UNIQUE约束
让我们举个例子表人,只有两个字段:id和data(json)。 SELECT data FROM peoples ; {"name": "Adam","pos":"DBA","age":22 } {"name": "Alice","pos":"Security","age":33 } {"name": "Bob","pos":"Manager","age":42 } 我想为“ pos”字段创建约束,该约束必须是唯一的。我在互联网上搜索了有关JSON约束的信息,但没有结果。 我该如何处理?

4
在触发器中是否为SELECT * OK。还是我在找麻烦?
我在工作中陷入一场辩论,我需要一些有关我可能会忽略的陷阱的建议。 想象一下使用触发器将已删除记录复制到审核表的情况。触发器使用SELECT *。每个人都指向并大喊,并告诉我们这有多糟糕。 但是,如果对主表的结构进行了修改,而忽略了审计表,则触发器将产生一个错误,使人们知道审计表也需要修改。 在我们的DEV服务器上进行测试的过程中将捕获该错误。但是我们需要确保生产匹配DEV,因此我们在生产系统中允许SELECT *(仅适用于触发器)。 所以我的问题是:我被迫删除SELECT *,但是我不确定如何确保我们自动捕获这种性质的开发错误,任何想法或这是最佳实践? 我在下面整理了一个例子: --Create Test Table CREATE TABLE dbo.Test(ID INT IDENTITY(1,1), Person VARCHAR(255)) --Create Test Audit Table CREATE TABLE dbo.TestAudit(AuditID INT IDENTITY(1,1),ID INT, Person VARCHAR(255)) --Create Trigger on Test CREATE TRIGGER [dbo].[trTestDelete] ON [dbo].[Test] AFTER DELETE NOT FOR REPLICATION AS BEGIN SET NOCOUNT ON; …

1
为一个文件夹中的多个.DTSX软件包文件确定PackageFormatVersion
肯尼斯·费舍尔(Kenneth Fisher)发表了一篇博客文章,介绍如何确定我的SSIS包是什么SQL版本?在2015年4月。 它具有一个表,该表将哪个SQL版本映射到PackageFormatVersionXML元数据中找到的哪个SSIS包。在查看1个单个包装时,此功能很有用。 我有一个大约100个SSIS .DTSX软件包的文件夹,我需要知道它们都是哪个SQL版本。 如何批量确定文件夹(文件系统)中PackageFormatVersion多个.DTSX软件包的版本(即SQL版本)? 最终目标是确定要获取并实施以将这些软件包放入其中的正确的TFS版本,因为当前不存在任何源代码控制系统。肯尼斯提出的表格将帮助我回答这个问题,但是首先我需要确认软件包的SQL版本是什么。 假设我没有安装BIDS或SSDT。 假设所需的输出是这样的,其中管道指定一个新列: PackageFilename | PackageFormatVersion -------------------------------------- Package1.dtsx | 3 Package2.dtsx | 4 欢迎使用PowerShell,TSQL,可以抓取目录结构的第三方工具或其他工具。

2
SQL Server 2016 Standard Edition是否支持表分区?
我想将我的SQL Server 2008企业版升级到SQL Server 2016标准版; 但是,一个数据库利用多个文件组上的表分区(用于大型日志表,每天都是一个分区) 我在SQL Server 2016的版本和受支持的功能的“ RDBMS可伸缩性和性能”部分下看到,它说标准版支持表和索引分区,但是不支持分区表并行。 我不确定我是否完全理解这一后果。 在我看来,这到底是什么意思,它将如何影响数据库的性能?

1
自动更新统计信息不更新统计信息
我用SQL SERVER 2012我有我Auto Update Stats 对我的数据库。 从下面的链接中,我了解到,对于SQRT(1000 * Table rows)表行中的每个更改,自动更新统计信息都会触发。 https://blogs.msdn.microsoft.com/srgolla/2012/09/04/sql-server-statistics-explained/ 我创建了一个包含1000条记录的表 SELECT TOP 500 Row_number()OVER (ORDER BY (SELECT NULL)) rn, name INTO stst FROM sys.objects 建立统计资料 CREATE STATISTICS rn ON stst (rn) CREATE STATISTICS name ON stst (name) 检查创建的统计信息 DBCC show_statistics('stst', rn) -- Rows 500 DBCC show_statistics('stst', name) -- …

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.