数据库管理员

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

1
如何在统计中确定直方图的步数
如何在SQL Server的“统计信息”中确定直方图步数? 为什么即使我的键列有200多个不同的值,它也限制为200步?有决定因素吗? 演示版 模式定义 CREATE TABLE histogram_step ( id INT IDENTITY(1, 1), name VARCHAR(50), CONSTRAINT pk_histogram_step PRIMARY KEY (id) ) 在表中插入100条记录 INSERT INTO histogram_step (name) SELECT TOP 100 name FROM sys.syscolumns 更新和检查统计信息 UPDATE STATISTICS histogram_step WITH fullscan DBCC show_statistics('histogram_step', pk_histogram_step) 直方图步骤: +--------------+------------+---------+---------------------+----------------+ | RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | …


1
SQL Server中统计信息的默认样本大小是多少?
从MSDN: 如果(SAMPLE, FULLSCAN, RESAMPLE)未指定任何样本选项,则查询优化器默认对数据进行采样并计算样本大小。 如何确定统计数据的默认样本量? 我经历了MSDN,但没有找到任何公式或方法来标识默认样本大小。到处都只有公式可以触发自动统计信息更新。任何指针都会有所帮助。


1
在pg_dump定位到另一台机器的过程中,拒绝创建“ pg_catalog.tablename”的权限
我正在尝试将某些表从9.5 beta 2转储到9.4.4服务器。我使用的命令的形式是相当标准的: pg_dump -t table dbname | psql -h hostname -d dbname 我正在使用Postgres用户,我意识到这可能并不理想,但是因为这两个都是我仅使用的dev数据处理框,所以与随后的错误有关。最初,我得到了错误 错误:无法识别的配置参数“ row_security” 这是预期的,因为此功能是9.5中的新增功能,是的,我意识到不建议在不同的Postgres版本之间使用pg_dump,但是,令人遗憾的是,由于我遇到了一个非常模糊的错误,并且需要移动一个大的错误,这是不可避免的一次静态数据量。 因此,使用此可怕的技巧来删除row_security错误,然后在第一个错误上启用stop: pg_dump -t tablemame dbname |sed 's/SET row_security = off;//'| psql -v ON_ERROR_STOP=1 -h hostname -d dbname 我现在得到: 错误:拒绝创建“ pg_catalog.tablename”的权限详细信息:当前不允许修改系统目录 尽管可能不希望使用Postgres用户/角色,但我的理解是应该没有这种性质的权限问题。对于任何建议,我都持开放态度,因为这是一次性操作,并且它们是未连接到任何实时服务的数据处理开发箱,因此权宜于优先于理想的公司数据访问策略。话虽如此,最好了解如何正确执行此操作,并在将来避免这样做。

4
如何将具有外键约束的列添加到已存在的表中?
我有下表 CREATE TABLE users (id int PRIMARY KEY); -- already exists with data CREATE TABLE message (); 我该如何更改messages表格, 一个名为的新列sender被添加到其中 sender引用该users表的外键在哪里 这没用 # ALTER TABLE message ADD FOREIGN KEY (sender) REFERENCES users; ERROR: column "sender" referenced in foreign key constraint does not exist 此语句是否也不会创建该列?

1
UPDATE STATISTICS…WITH ROWCOUNT后如何重置统计信息
为了进行查询调整和测试,您可以通过运行手动将行计数和页计数分配给表的索引统计信息UPDATE STATISTICS。但是,如何将统计信息重新计算/重置为表的实际内容? --- Create a table.. CREATE TABLE dbo.StatTest ( i int NOT NULL, CONSTRAINT PK_StatTest PRIMARY KEY CLUSTERED (i) ); GO --- .. and give it a thousand-or-so rows: DECLARE @i int=1; INSERT INTO dbo.StatTest (i) VALUES (@i); WHILE (@i<1000) BEGIN; INSERT INTO dbo.StatTest (i) SELECT @i+i FROM dbo.StatTest; …

2
未使用的索引最佳做法
根据此查询,如果我发现总读取量很少(非常接近0或0,例如1或2),而用户更新量则较高或中等(我无法通过此查询找到插入或删除的内容),行数很大时,理论上我应该删除索引。 SELECT DISTINCT OBJECT_NAME(s.[object_id]) AS ObjectName , p.rows TableRows , i.name AS [INDEX NAME] , (user_seeks + user_scans + user_lookups) AS TotalReads , user_updates UserUpdates FROM sys.dm_db_index_usage_stats s INNER JOIN sys.indexes i ON i.[object_id] = s.[object_id] AND i.index_id = s.index_id INNER JOIN sys.partitions p ON p.object_id = i.object_id WHERE OBJECTPROPERTY(s.[object_id],'IsUserTable') …

6
将多个值存储在一行的一个字段中而不是单独存储的可能的好处
在我们上一次的每周会议上,一个没有数据库管理经验的人提出了以下问题: “是否有一种场景可以证明以行(字符串)而不是几行的形式存储数据?” 让我们假设有一个表countryStates,我们要在其中存储一个国家的州。在本示例中,我将使用USA,并且为了懒惰,不会列出所有州。 在那里,我们将有两列;一个被称为Country,另一个被称为States。作为讨论在这里,并通过@ srutzky提出的答案时,PK会通过定义的代码ISO 3166-1阿尔法-3。 我们的表如下所示: +---------+-----------------------+-------------------------------------------------------+ | Country | States | StateName | +---------+-----------------------+-------------------------------------------------------+ | USA | AL, CA, FL,OH, NY, WY | Alabama, California, Florida, Ohio, New York, Wyoming | +---------+-----------------------+-------------------------------------------------------+ 当向朋友开发人员询问相同的问题时,他说,从数据流量大小的角度来看,这可能很有用,但是如果我们需要操纵这些数据则没有用。在这种情况下,必须在应用程序代码上具有智能,该智能可以转换列表中的此字符串(假设可以访问此表的软件需要创建一个组合框)。 我们得出的结论是,该模型不是很有用,但是我怀疑可能有一种使之有用的方法。 我想问的是,你们中是否有人已经以一种切实有效的方式看到,听到或做过类似的事情。

3
架构迁移:SQL Server数据工具与Liquibase和Flyway
这似乎是一个愚蠢的问题,但是我一直在研究用于架构迁移的开源解决方案,即Liquibase和Flyway。 但是,老板告诉我,SQL Server数据工具(SSDT)可以完成相同的工作。我不确定是否同意,但是我在互联网上几乎找不到直接将其与Liquibase和/或Flyway进行比较的东西。 我认为SSDT是SQL Server的开发,数据建模和设计工具,还支持架构比较(并生成其脚本)和源代码控制。它解决了一个不同的问题,尽管在模式迁移的某些方面可能与Liquibase / Flyway有所重叠。但是,作为整体架构迁移工具,Liquibase和Flyway是完全专用的工具,而SSDT则更多地用于数据库的设计和开发。 即使只是说没有可比性,SSDT本身也不是任何模式迁移工具,任何意见都会受到赞赏。
11 schema  ssdt  migration 

3
可怜的基数估计使INSERT无法进行最少的记录?
为什么第二个INSERT语句比第一个语句慢5倍? 从生成的日志数据量来看,我认为第二个不符合最小日志记录的条件。但是,《数据加载性能指南》中的文档指出,两个插入都应该能够被最小限度地记录。因此,如果最小日志记录是关键性能差异,那么为什么第二个查询不符合最小日志记录的条件?可以采取什么措施来改善这种情况? 查询#1:使用INSERT ... WITH(TABLOCK)插入5MM行 考虑以下查询,该查询将5MM行插入堆中。该查询在中执行1 second并生成64MB事务日志数据,如所报告sys.dm_tran_database_transactions。 CREATE TABLE dbo.minimalLoggingTest (n INT NOT NULL) GO INSERT INTO dbo.minimalLoggingTest WITH (TABLOCK) (n) SELECT n -- Any table/view/sub-query that correctly estimates that it will generate 5MM rows FROM dbo.fiveMillionNumbers -- Provides greater consistency on my laptop, where other processes are running OPTION …

3
NOLOCK提示更改返回记录的顺序
在表Client字段上有一个聚集索引LastName。 当我简单地转储表中的所有记录时,除非按(nolock)提示使用提示,否则它们将按字母顺序显示。该提示会更改记录的顺序。应该是?。我敢肯定,没有其他会话具有对该表所做的更改的开放事务(至少sp_who2没有显示任何内容)。 如何解释顺序上的差异? 从评论中提取的其他信息: 没有命令。非聚集索引是否应强制执行该命令? 即使使用指定聚簇索引的索引提示,查询仍然返回不同的顺序。应该吗 我想知道为什么nolock在不明显更改计划的情况下更改返回记录的顺序。 我对它们做了一个WinDiff-除了(nolock)[查询提示] 之外,其他都一样。

2
我应该使用UUID还是ID
我已经在系统中使用UUID一段时间了,原因有很多,从日志记录到延迟的关联。随着我变得越来越幼稚,我使用的格式发生了变化: VARCHAR(255) VARCHAR(36) CHAR(36) BINARY(16) 当我到达最后一个时BINARY(16),我开始将性能与基本自动递增整数进行比较。测试和结果如下所示,但如果你只是想总结,表示INT AUTOINCREMENT和BINARY(16) RANDOM对数据相同的性能范围高达20万(该数据库已预先填充之前测试)。 最初,我对将UUID用作主键持怀疑态度,确实确实如此,但是我发现这里有潜力创建一个可以同时使用两者的灵活数据库。尽管许多人强调这两种方法的优点,但同时使用这两种数据类型可以消除哪些缺点呢? PRIMARY INT UNIQUE BINARY(16) 这种类型的设置的用例将是表间关系的传统主键,并且具有用于系统间关系的唯一标识符。 我本质上试图发现的是两种方法之间的效率差异。除了所使用的四倍磁盘空间(在添加其他数据后可能几乎可以忽略不计)外,在我看来它们是相同的。 架构: -- phpMyAdmin SQL Dump -- version 4.0.10deb1 -- http://www.phpmyadmin.net -- -- Host: localhost -- Generation Time: Sep 22, 2015 at 10:54 AM -- Server version: 5.5.44-0ubuntu0.14.04.1 -- PHP Version: 5.5.29-1+deb.sury.org~trusty+3 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; …

3
从SSDT部署中排除特定表
我有一个现有的数据库,所有内容都在schema中dbo。我有一个SSDT项目,其中包含要通过架构添加到其中的对象foo 我在项目中有一个看起来像这样的表: CREATE table foo.a ( id INT NOT NULL CONSTRAINT [PK_foo_a] PRIMARY KEY CLUSTERED CONSTRAINT [FK_foo_a] FOREIGN KEY REFERENCES [dbo].[a], desc NVARCHAR(50) NOT NULL ) 这取决于dbo.a。dbo.a有许多列,这些列是其他列的外键。其他人(维护默认架构)可能会更改dbo.a。 我想简单地将dbo.a存储为: CREATE table dbo.a ( id INT NOT NULL CONSTRAINT [PK_a] PRIMARY KEY CLUSTERED ) 因此它是在内部构建的,但未部署。那可能吗?
11 ssdt  deployment 

2
通过PostgreSQL中的视图和触发器跟踪当前用户
我有一个PostgreSQL(9.4)数据库,该数据库根据当前用户限制对记录的访问,并跟踪用户所做的更改。这是通过视图和触发器实现的,并且在大多数情况下都可以正常工作,但是我在需要INSTEAD OF触发器的视图中遇到了问题。我试图减少问题的发生,但是我很抱歉这仍然很长。 情况 与数据库的所有连接都是通过Web前端通过单个帐户进行的dbweb。连接后,通过SET ROLE使用Web界面更改角色以使其与该人相对应,并且所有这些角色都属于组角色dbuser。(有关详细信息,请参见此答案)。假设用户为alice。 我的大多数表都放在一个架构中,在这里我将对其进行调用private并属于dbowner。这些表不能直接访问dbuser,但可以用作另一个角色dbview。例如: SET SESSION AUTHORIZATION dbowner; CREATE TABLE private.incident ( incident_id serial PRIMARY KEY, incident_name character varying NOT NULL, incident_owner character varying NOT NULL ); GRANT ALL ON TABLE private.incident TO dbview; 特定行对当前用户的可用性alice由其他视图确定。一个简化的示例(可以减少,但需要通过这种方式来支持更一般的情况)将是: -- Simplified case, but in principle could join multiple tables to determine allowed …

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.