数据库管理员

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

1
结合全文本和标量索引
假设我们有一个1200万个名称和地址的数据库,这些数据库需要使用全文本进行搜索,但是每行也包含一个整数值,例如COMPANYID。该表在这1200万行中包含约250个不同的COMPANYID。 定义全文索引时,是否可以COMPANY在树中赋予每个索引自己的“分支”?

1
最新服务器上的性能降低
我们有几个生产中的数据库服务器,其中有四个具有非常相似的硬件配置。Dell PowerEdge R620,唯一的不同是2个最新的(购买和配置3个月前)具有RAID控制器v710、256GB RAM和CPU,是2个物理Xeon E5-2680 2.80GHz。旧版本(大约在1年前购买和配置)具有RAID控制器v700、128GB RAM并运行在第2台物理Xeon E5-2690 2.90GHz上。BIOS已更新,所有驱动程序已更新为最新版本,等等。所有正在运行的SQL Server 2008R2 Enterprise(SP1)已更新为最新CU和Windows 2012R2 Standard。两者都在200 GB SSD x5 RAID10上运行。每个数据库上仅运行一个数据库,使用调用SSIS程序包的作业进行同步。我们的系统管理员已进行了大量性能和压力测试,以确保我们没有任何硬件或网络遗漏配置或故障。不出所料,最新的表现出更好的性能结果。到目前为止,一切都很好。 在Kibana的屏幕截图中可以看到我们遇到的问题。黄色和橙色是2台较新的服务器(表上为6.7),在所有其他服务器之下。完全可见这2台新服务器的响应时间较慢。不仅如此,而且这2台服务器的负载也比2台旧服务器(表上的浅蓝色和深蓝色线-4,5)要少一些。 有几个监视脚本,用于收集有关性能计数器的信息。尽可能地利用DMV和第三个监视工具进行挖掘,我掌握了很多信息。但是这里应该有(ofc)我缺少的东西,因为我找不到这种较慢的响应时间的答案。 这两个最新的服务器使用的RAM较少,但是与其他较旧的服务器相比,这是可以预期的,因为它们的负载较低。 | Server Name| Mem_MB | Mem_GB | Server_RAM_GB | SQL_max_mem_GB| SQL_min_mem_GB | |------------|--------|--------------|---------------|---------------|----------------| | 4 | 41108 | 40.145263671 | 128 | 120 | 16 | | 5 | …

3
如何对Microsoft SQL Server进行基准测试
在我的公司中,我们有多个托管SQL Server 2008 R2的虚拟机,其中一些虚拟机的性能与其他虚拟机不同,一些是由于Vmware主机非常繁忙,有些是由于与NAS的连接速度较慢。 有没有一种方法可以在测试SQL数据库中运行某些SQL代码或其他我可以用来在每个VM中运行一些性能测试以及基准/基准性能的最佳实践,以便在移动之前我可以了解哪台计算机的性能优于其他计算机那些机器到Prod或UAT环境?谢谢戴维。

1
MySQL复制:落后于Master的秒数超高
我已经为生产数据库设置了一个从属db服务器,但是当我检查show slave的状态时,我发现它比master落后几秒钟。 这是输出: Slave_IO_State: Waiting for master to send event Master_Host: 1.2.3.4 Master_User: replicator Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000173 Read_Master_Log_Pos: 15909435 Relay_Log_File: mysqld-relay-bin.000079 Relay_Log_Pos: 91173356 Relay_Master_Log_File: mysql-bin.000093 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 91173210 Relay_Log_Space: 8179978166 Until_Condition: None Until_Log_File: …

1
如何限制MongoDB中每个主机的连接?
我正在运行一个mongo服务器,该服务器通过Java驱动程序接受来自其他客户端的连接。我注意到的事情是一段时间后,一些用户打开了太多端口,这阻止了其他用户连接到mongo。他们仅创建1个mongoClient对象,尽管检查其IP结果会监视数百个端口。 我遇到了一个示例来限制Java驱动程序中每个主机的连接,但是我不希望客户端弄乱它。如何限制我的mongod实例的客户端? 该实例是在Linux远程服务器上运行的1个mongod。

1
PostgreSQL流与基于文件的复制(就服务器行为和配置而言)
我试图了解PostgreSQL复制的最佳用法及其工作方式,以便在生产环境中进行故障排除。 我很难理解以下两种复制类型之间的区别:(1)配置(2)在每种情况下主/从2个服务器的性能 在PostgreSQL(9.2+)上的复制实际上是在Master上创建大小为16MB的XLOG文件(取决于创建每个文件的频率设置),并通过某种方法发送到Slave。 我的设置(出于这个问题的目的) 在主archive_command ='rsync -av%p postgres @ [SlaveIP]:[wal_archive_folder] /%f' 上配置Postgresql.conf 从属服务器上配置Recovery.conf以读取日志文件 restore_command ='cp [wal_archive_folder] /%f \“%p \”' primary_conninfo ='主机= [MasterIP]端口= 5432 user = postgres' 我的问题是,此配置的哪一部分使这种“流式”复制与“日志传送”相比较?我的主服务器配置为使用rsync将日志发送到从服务器(此日志是否发送?)我的从服务器配置为能够在recovery.conf中连接到主服务器(此数据流吗?) 问题的第二部分:发生了什么?我了解PostgreSQL上还有一个通过WAL_sender和WAL_receiver的协议。但是我不清楚这是否仅用于流式传输,如果是,则rsync在主服务器中如何使用? :) 谢谢!!很抱歉,如果这是一个明显的问题。我一直在阅读大量的博客/书籍,但是很难理解。Postgres Wiki的深度是如此之深,以至于需要花很长时间才能完全理解(我有最后期限)

1
两台服务器中MySQL性能的巨大差异
我们有一个安装在两台不同机器上的MySQL服务器,分别是测试服务器和生产服务器,这两个窗口都是Web应用程序使用的窗口。 问题在于,执行某些查询时,两台计算机之间存在巨大的性能差异(生产服务器是速度较慢的服务器)。两台服务器中的MySQL版本相同,甚至配置文件也相同(唯一的区别是数据的路径以及生产服务器除了错误外不记录任何东西)。我所说的性能差异要大3或4个数量级(例如,测试服务器中的查询执行时间为0.2 s,而生产服务器中的查询执行时间为84 s)。 令人讨厌的查询大量使用了带有“ WHERE [...] IN [...]”的子句,据我所知,它们通常非常慢,应将其替换为JOIN。但是,我们使用的MySQL版本是5.6.19,它会自动优化那些查询,这就是为什么它们在测试服务器中能快速执行的原因(而且它们属于程序的一部分,我们无法更改,因此我们无法手动对其进行优化)无论如何)。 就像我说的那样,MySQL的安装和配置是相同的,因此对于问题可能出在哪里我一无所知。一方面,我怀疑这一定是某种配置问题,因为程序和DB相同,另一方面,由于配置相同,所以这没有意义。 服务器上的一些数据: 测试服务器: 英特尔酷睿2四核Q9400 @ 2.66GHz 8GB RAM Windows Server 2008 R2标准 生产服务器: 英特尔至强E5530 @ 2.40GHz 5GB RAM Windows Server 2012 R2标准 编辑:我忘了说一件重要的事情:还有更多的查询正在执行,这些查询使用“ WHERE ... IN”子句作为“违规”子句。它们在两台计算机上都可以快速执行,这表明我已经通过MySQL对其进行了优化。如果这是实际问题(我不确定),那么对某些查询进行优化(而不对其他查询进行优化)的事实对我来说是个谜。 编辑#2:这是两个服务器的配置文件:http : //pastebin.ca/2834906 编辑#3:这是慢速查询之一的解释:https ://mariadb.org/ea/v36zj EXPLAIN在测试和产品中完全相同。查询本身在这里:http : //pastebin.com/VXgBxXmt它已经使用自动格式化程序进行了格式化,因此可能不是很清楚。如您所见,它相当长且复杂。它不是手动生成的,而是由软件自动生成的,该软件使用标准SQL的方言和某些功能。 另外,更多信息:我们通过减少生产服务器中的数据并删除了数据库中将不使用的大多数旧数据来临时修补了该问题。当然,这不是解决方案,因为我们还需要旧数据,将来会成为问题。DB并不是那么大:完整的DB为1308MB,目前正在生产的精简版本为332MB。 更新:已解决? 我想我已经解决了问题。由于尚未使用生产服务器,因此我尚未对其进行测试,但是可能的问题是参数“ innodb_buffer_pool_size”,该参数设置为182M。实际上,配置文件中的行显示:innodb_buffer_pool_size = 321这是一个错误,因为它没有单位前缀,给出了无效的值(根据文档,最小值为5242880),然后将其置于先前的值。测试服务器中的该值设置为所需的321M。 如我所说,我还没有完全测试过。我所做的是降低测试价值并尝试应用程序。一切都变慢了,我发布的特定查询将在3分钟内执行。 …

2
sys.dm_db_index_usage_stats中的信息是否可靠
我正在从没有文档的旧系统中归档数据。幸运的我... 我想找出表的创建时间,上次访问时间等。我是否可以相信此查询将为我提供正确的答案,还是我首先需要检查一些参数?SQL Server 2008 R2: SELECT t.Name AS Tabelname, p.rows AS NoOfRows, MAX(us.last_user_lookup) AS LastUsed, t.create_date AS CreatedDate FROM sys.tables t INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id LEFT JOIN --A lot of the tables did not …

1
填充日期维度表的最佳方法
我正在寻找在SQL Server 2008数据库中填充日期维度表的方法。表中的字段如下: [DateId] INT IDENTITY(1,1) PRIMARY KEY [DateTime] DATETIME [Date] DATE [DayOfWeek_Number] TINYINT [DayOfWeek_Name] VARCHAR(9) [DayOfWeek_ShortName] VARCHAR(3) [Week_Number] TINYINT [Fiscal_DayOfMonth] TINYINT [Fiscal_Month_Number] TINYINT [Fiscal_Month_Name] VARCHAR(12) [Fiscal_Month_ShortName] VARCHAR(3) [Fiscal_Quarter] TINYINT [Fiscal_Year] INT [Calendar_DayOfMonth] TINYINT [Calendar_Month Number] TINYINT [Calendar_Month_Name] VARCHAR(9) [Calendar_Month_ShortName] VARCHAR(3) [Calendar_Quarter] TINYINT [Calendar_Year] INT [IsLeapYear] BIT [IsWeekDay] BIT [IsWeekend] …

1
是否可以从BLACKHOLE表中恢复数据?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为数据库管理员Stack Exchange 的主题。 5年前关闭。 我已经使用引擎BLACKHOLE创建了表, 基本上,BLACKHOLE存储引擎充当了“黑洞”,该黑洞可以接受数据,但会将其丢弃而不进行存储。检索总是返回空结果。 听说我们可以通过使用存储引擎为innodb或myisam的新表创建与旧表相同的新表来检索数据。但是我也尝试过,但是无法获得结果。任何人都可以帮助我解决此问题。 mysql> CREATE TABLE test1(i INT, c CHAR(10)) ENGINE = BLACKHOLE; Query OK, 0 rows affected (0.08 sec) mysql> INSERT INTO test1 VALUES(1,'record one'),(2,'record two'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from …

1
与单独的SELECT相比,在OR条件下索引查找要慢得多
根据这些问题和给出的答案: SQL 2008 Server-性能损失可能与非常大的表有关 具有历史数据的大表分配了过多的SQL Server 2008 Std。内存-其他数据库的性能损失 我在数据库SupervisionP中有一个表,定义如下: CREATE TABLE [dbo].[PenData]( [IDUkazatel] [smallint] NOT NULL, [Cas] [datetime2](0) NOT NULL, [Hodnota] [real] NULL, [HodnotaMax] [real] NULL, [HodnotaMin] [real] NULL, CONSTRAINT [PK_Data] PRIMARY KEY CLUSTERED ( [IDUkazatel] ASC, [Cas] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS …

1
在使用集群复合键对表进行“大”插入期间会发生什么?
我的SQL知识是有限的,因此我将使用的术语很可能不是正确的术语。 我有一个表,用于存储多个位置的测试结果。 测试将记录在不同位置(没有网络连接)的不同数据库中,并且“主”位置将定期从其他位置“导入”测试结果。 我计划在LocationId(int)和Date(datetime)列上按此顺序有一个集群复合主键。原因是它应该将一个位置的所有结果保持在一起,并且我几乎永远不会按日期范围进行查询,而是按日期范围和位置进行查询。 行大小为80到100个字节,测试结果的数量不应超过几百万。典型的“导入”将从另一个位置插入50到10万个结果。 进口期间会发生什么?SQL是否会“移动”现有行以维护集群,还是会让表变得“碎片化”?如果一次完成一行导入,是否会对性能造成重大影响?我是否应该只是不理会行的顺序,而只是添加一个Identity列作为主键,并在Date列上添加一个索引来帮助查询?

2
在PostgreSQL 8.4中重新索引之前,是否应该总是进行VACUUM ANALYZE?
每天清晨,一个pgAgent作业都会从我的PostgreSQL 8.4数据库中的表B中刷新表A的内容。表A在91列中包含约140k记录,并具有两个索引-一个作为PRIMARY KEY的一部分,另一个在POINT PostGIS几何列上的GIST索引。 为了使过程更快一些,作业将删除几何列上的索引,然后删除表A中的记录并从表B中插入记录,然后重新创建索引。autovacuum守护程序在感觉良好时就可以完成所有工作(大约在十分钟后,通过比较作业状态和表状态的作业完成时间和autovacuum运行时间)。 在所有这些都发生之后,今天早上检查表时,表统计信息告诉我表大小为272MB,TOAST表大小为8192bytes,索引大小为23MB。这似乎很大,所以我在表上发出了REINDEX命令,索引大小降至9832kB。 我的问题是这样的: 为什么当从头开始重新构建索引(或至少是几何列索引)时,REINDEX会明显减少索引的大小?我应该确定在建立索引之前已经对表进行了清理/分析吗?这不是在主键上删除索引的一个因素吗?我想念什么?

3
AlwaysOn可用性组log_send_rate
在所有在虚拟机和裸机上运行Windows 2012和SQL Server 2012的AlwaysOn设置上,我发现log_send_rate sys.dm_hadr_database_replica_states始终返回错误值。 例如(对于同步模式) sys.dm_hadr_database_replica_states.log_send_rate(ave = 36,571(kb / s在bol中列出)) Perfmon-SQLServer:可用性副本-发送到副本/秒的字节数(最大值= 486,000.000,平均= 259,000.000) Perfmon-SQLServer:Databases-刷新的日志字节/秒(最大值= 653,044.000,平均= 341,000.000) 我还没有看到任何关于此的帖子,但它似乎无法正常工作。正确的log_send_rate值对于监视AlwaysOn很有用。 其他人有没有经历过?

2
未使用但影响查询的索引
我有一个带有一些数字和一些其他数据的PostgreSQL 9.3表: CREATE TABLE mytable ( myid BIGINT, somedata BYTEA ) 该表当前有约10M条记录,并占用1GB磁盘空间。myid不连续。 我想计算100000个连续数字的每个块中有多少行: SELECT myid/100000 AS block, count(*) AS total FROM mytable GROUP BY myid/100000; 这将返回大约3500行。 我注意到,即使查询计划根本没有提及某个索引,该索引的存在也会显着加快此查询的速度。没有索引的查询计划: db=> EXPLAIN (ANALYZE TRUE, VERBOSE TRUE) SELECT myid/100000 AS block, count(*) AS total FROM mytable GROUP BY myid/100000; QUERY PLAN ---------------------------------------------------------------------------------------------------------------------------------------- GroupAggregate (cost=1636639.92..1709958.65 …

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.