数据库管理员

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

5
我可以添加一个忽略现有违规的唯一约束吗?
我有一个表,当前在列中有重复的值。 我无法删除这些错误的重复项,但我想防止添加其他非唯一值。 我可以创建一个UNIQUE不检查现有合规性的商品吗? 我尝试使用,NOCHECK但未成功。 在这种情况下,我有一个表将许可信息与“ CompanyName”相关联 编辑:具有相同的“ CompanyName”具有多个行是错误的数据,但此时我们不能删除或更新这些重复项。一种方法是让INSERTs使用存储过程,该存储过程将导致重复操作失败...如果可以让SQL自己检查唯一性,那将是更好的选择。 该数据通过公司名称查询。对于少数现有重复项,这将意味着将返回并显示多行...虽然这是错误的,但在我们的用例中是可以接受的。目的是防止将来发生这种情况。从评论看来,我似乎必须在存储过程中执行此逻辑。

4
如何动态基于另一个表的值更新一个表?
我有一个以ips为名的表格,如下所示: CREATE TABLE `ips` ( `id` int(10) unsigned NOT NULL DEFAULT '0', `begin_ip_num` int(11) unsigned DEFAULT NULL, `end_ip_num` int(11) unsigned DEFAULT NULL, `iso` varchar(3) DEFAULT NULL, `country` varchar(150) DEFAULT NULL ) ENGINE=InnoDB 假设我countryid在国家表的此表上有一个字段,如下所示: CREATE TABLE `country` ( `countryid` tinyint(3) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci …
40 mysql  update 

2
MySql中的VARCHAR字段上可能的INDEX
我正在使用这样的表在MySql数据库中工作: +--------------+ | table_name | +--------------+ | myField | +--------------+ ...并且我需要进行很多这样的查询(列表中有5-10个字符串): SELECT myField FROM table_name WHERE myField IN ('something', 'other stuff', 'some other a bit longer'...) 大约有24.000.000个唯一行 1)我应该使用FULLTEXTor或and INDEX键VARCHAR(150)吗? 2)如果我将字符数从150增加到220或250 ...会产生很大的不同吗?(有什么方法可以计算出来吗?) 3)正如我所说,它们将是唯一的,因此myField应该是PRIMARY KEY。在已经是VARCHAR INDEX / FULLTEXT的字段中添加PRIMARY KEY难道不是很罕见吗?

3
在PostgreSQL中实现UPSERT的惯用方式
我已经阅读了UPSERTPostgreSQL中的不同实现,但是所有这些解决方案都相对较旧或相对陌生(例如,使用可写CTE)。 而且我根本不是psql专家,可以立即找出这些解决方案是否过时,因为它们是值得推荐的,还是(几乎所有它们都是)仅仅是玩具示例而不适合生产使用。 在PostgreSQL中实现UPSERT的最线程安全的方法是什么?

2
具有用户,角色和权限的数据库模型
我有一个带有用户表和角色表的数据库模型。我想控制对多达10个不同元素的访问(权限)。可以将访问权限授予角色或单个用户。以下是用户,角色和项目的表定义: CREATE TABLE users ( id serial NOT NULL PRIMARY KEY, username character varying UNIQUE, password character varying, first_name character varying, last_name character varying, ... ); CREATE TABLE roles ( id serial NOT NULL PRIMARY KEY, name character varying NOT NULL, description character varying, ... ); CREATE TABLE element_1 ( …




3
SQL Server的“总服务器内存”消耗停滞了数月,而可用空间增加了64GB以上
我遇到了一个奇怪的问题,即SQL Server 2016 Standard Edition 64位似乎已经限制了为其分配的总内存的正好一半(128 GB的64GB)。 输出@@VERSION为: Microsoft SQL Server 2016(SP1-CU7-GDR)(KB4057119)-13.0.4466.4(X64)2017年12月22日11:25:00版权所有(c)Windows Server 2012 R2 Datacenter 6.3上的Microsoft Corporation标准版(64位)(内部版本9600:)(管理程序) 输出sys.dm_os_process_memory为: 当我查询时sys.dm_os_performance_counters,我看到Target Server Memory (KB)处的131072000,Total Server Memory (KB)位于处的一半65308016。在大多数情况下,我认为这是正常现象,因为SQL Server尚未确定它需要为其自身分配更多的内存。 但是,它已经“卡住”了〜64GB,已经超过2个月了。在此时间段内,我们对某些数据库执行了大量内存密集型操作,并向实例添加了近40个数据库。我们共有292个数据库,每个数据库都有4GB的预分配数据文件(自动增长速率为256MB)和2GB的日志文件的自动增长速率为128MB。我每晚晚上12:00执行一次完整备份,并从星期一到星期五从6:00 AM到8:00 PM(每15分钟间隔)开始事务日志备份。这些数据库的整体吞吐量相对较低,但是我怀疑SQL Server尚未爬到Target Server Memory 很自然地会通过添加新数据库,正常查询执行以及已运行的占用大量内存的ETL管道来实现。 SQL Server实例本身位于虚拟化(VMware)Windows Server 2012R2服务器之上,该服务器具有12个CPU,144GB内存(128GB到SQL Server,16GB预留给Windows)以及总共4个虚拟磁盘,这些虚拟磁盘位于具有15K SAS驱动器的vSAN之上。Windows自然位于64GB C:磁盘上,页面文件为32GB。数据文件位于2TB D:磁盘上,日志文件位于2TB L:磁盘之上,而tempdb位于256GB T:磁盘上,其中8x16GB文件没有自动增长。 我已验证除之外,服务器上没有其他SQL Server实例在运行MSSQLSERVER。 该服务器完全专用于SQL Server实例,因此我们没有在其上运行的其他任何可能消耗内存的应用程序或服务。 我利用RedGate SQL …

6
为什么添加TOP 1会显着降低性能?
我有一个相当简单的查询 SELECT TOP 1 dc.DOCUMENT_ID, dc.COPIES, dc.REQUESTOR, dc.D_ID, cj.FILE_NUMBER FROM DOCUMENT_QUEUE dc JOIN CORRESPONDENCE_JOURNAL cj ON dc.DOCUMENT_ID = cj.DOCUMENT_ID WHERE dc.QUEUE_DATE <= GETDATE() AND dc.PRINT_LOCATION = 2 ORDER BY cj.FILE_NUMBER 那给了我可怕的表现(就像从来没有想过要等待它完成一样)。查询计划如下所示: 但是,如果我删除,则会TOP 1得到一个看起来像这样的计划,它会在1-2秒内运行: 在下面更正PK和索引。 该事实TOP 1改变了查询计划并不让我感到吃惊,我只是有点惊讶,这使情况变得更糟了这么多。 注意:我已经阅读了这篇文章的结果,并了解了Row Goaletc 的概念。我很好奇的是如何去改变查询,以便它使用更好的计划。目前,我正在将数据转储到临时表中,然后从中提取第一行。我想知道是否有更好的方法。 编辑对于在事实结束后仍在阅读本文的人,这里还有一些其他信息。 Document_Queue-PK / CI是D_ID,它具有约5k行。 Correspondence_Journal-PK / CI为FILE_NUMBER,CORRESPONDENCE_ID,具有约140万行。 当我开始时,没有其他索引。我最后在Correspondence_Journal(Document_Id,File_Number)上写了一个

2
如何优化在嵌套循环(内部联接)上运行缓慢的查询
TL; DR 由于这个问题一直在引起人们的关注,因此在这里我将对其进行总结,这样新来的人就不必经历历史了: JOIN table t ON t.member = @value1 OR t.member = @value2 -- this is slow as hell JOIN table t ON t.member = COALESCE(@value1, @value2) -- this is blazing fast -- Note that here if @value1 has a value, @value2 is NULL, and vice versa 我意识到这可能不是每个人的问题,但是通过强调ON子句的敏感性,它可以帮助您朝正确的方向看。无论如何,原始文本在这里供将来的人类学家使用: 原文 …

3
UAT和PROD服务器上执行计划的差异
我想了解为什么在UAT(运行3秒)与PROD(运行23秒)中执行相同查询会有如此大的差异。 UAT和PROD都具有准确的数据和索引。 查询: set statistics io on; set statistics time on; SELECT CONF_NO, 'DE', 'Duplicate Email Address ''' + RTRIM(EMAIL_ADDRESS) + ''' in Maintenance', CONF_TARGET_NO FROM CONF_TARGET ct WHERE CONF_NO = 161 AND LEFT(INTERNET_USER_ID, 6) != 'ICONF-' AND ( ( REGISTRATION_TYPE = 'I' AND (SELECT COUNT(1) FROM PORTFOLIO WHERE EMAIL_ADDRESS …

6
如何在MySQL中导入.sql文件?
我正在尝试使用MySQL Workbench导入.sql文件,但出现此错误: ERROR 1046 (3D000) at line 28: No database selected 我首先创建了一个空数据库,其名称与.sql文件相同,但不起作用。我还尝试使用以下命令通过mysql命令客户端执行此操作: mysqldump -u root database > file.sql 但是它说我的SQL语法有错误。此外,我不知道必须设置file.sql的路径。

2
在Postgres 9.2上增加work_mem和shared_buffers会大大减慢查询速度
我有一个运行在具有16GB RAM的8核RHEL 6.3计算机上的PostgreSQL 9.2实例。服务器专用于此数据库。鉴于默认的postgresql.conf在内存设置方面相当保守,我认为允许Postgres使用更多内存可能是一个好主意。令我惊讶的是,遵循wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server上的建议,实际上使我运行的每个查询速度显着降低,但是在更复杂的查询上显然更明显。 我还尝试运行pgtune,它给出了以下建议,并带有更多已调整的参数,但没有任何改变。它建议使用RAM大小的1/4的shared_buffers,这似乎与其他地方(尤其是PG Wiki)上的建议相符。 default_statistics_target = 50 maintenance_work_mem = 960MB constraint_exclusion = on checkpoint_completion_target = 0.9 effective_cache_size = 11GB work_mem = 96MB wal_buffers = 8MB checkpoint_segments = 16 shared_buffers = 3840MB max_connections = 80 我尝试在更改设置(使用reindex database)后为整个数据库重新编制索引,但这也无济于事。我玩过shared_buffers和work_mem。从非常保守的默认值(128k / 1MB)逐渐更改它们会逐渐降低性能。 我遇到EXPLAIN (ANALYZE,BUFFERS)了一些疑问,罪魁祸首似乎是哈希联接的速度明显慢。我不清楚为什么。 举一些具体的例子,我有以下查询。在默认配置下,它在〜2100ms内运行,在配置增加缓冲区的情况下,在〜3300ms内运行: select count(*) from contest c left outer …

2
改变列宽
增大列(nvarchar)宽度是否一定会使表格掉落? 换句话说,可以在具有活跃用户的生产环境中更改宽度吗? 我发现,如果大小增加(而不是减小),这将不是问题。
39 sql-server 

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.