数据库管理员

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

3
在聚集索引上重建,为什么datasize缩小?
当我们在其中包含约15gb数据的表的聚集索引上进行重建时,数据大小缩小到5gb,这怎么可能?什么样的“数据”被删除? 数据大小,我的意思是DBCC sp_spaceused的“数据”列 在聚集索引上重建之前: name rows reserved data index_size unused LEDGERJOURNALTRANS 43583730 39169656 KB 15857960 KB 22916496 KB 395200 KB 在聚集索引上重建后: name rows reserved data index_size unused LEDGERJOURNALTRANS 43583730 29076736 KB 5867048 KB 22880144 KB 329544 KB 用于重建的TSQL: USE [DAX5TEST] GO ALTER INDEX [I_212RECID] ON [dbo].[LEDGERJOURNALTRANS] REBUILD PARTITION = ALL …

2
删除辅助数据文件。DBCC SHRINKFILE:无法移动页面,因为它是工作表页面
我为创建了太多辅助数据文件(.ndf)tempdb。要删除多余的文件,我需要清空文件(内容将移至其他文件): DBCC SHRINKFILE('tempdbfile8', EMPTYFILE); 然后删除文件: ALTER DATABASE tempdb REMOVE FILE tempdbfile8; 但是EMPTYFILE命令返回错误: DBCC SHRINKFILE: Page 8:41920 could not be moved because it is a work table page. Msg 2555, Level 16, State 1, Line 2 Cannot move all contents of file "tempdbfile8" to other places to complete the emptyfile operation. …

1
MySqlDump的DISABLE KEYS对导入无效
我对我之前关于Inno-Tables的导入速度的问题有一个后续问题(惊奇!)。 方案 我尝试在合理的时间内在本地开发计算机上导入一些big *数据库转储。我们KEY在表上附加了许多s,这些表原来是瓶颈,但对于我们的实时系统仍然很重要。 在问完上述问题后,我的方法是KEY ...从转储,导入和重新添加键中删除语句。 但是,我经常发现自己正在编辑当前的转储以将其导入本地,并且偶然发现了这些有趣的“注释”(- disable/enable keys行) -- -- Dumping data for table `monster` -- LOCK TABLES `monster` WRITE; /*!40000 ALTER TABLE `monster` DISABLE KEYS */; INSERT … INSERT … INSERT /*!40000 ALTER TABLE `monster` ENABLE KEYS */; UNLOCK TABLES; 但实际上,这些“注释”是有条件的MySql语句 这对我来说是个新闻,但好的,鉴于输出形式mysql --version对我来说一切正常: mysql Ver 14.14 Distrib 5.5.38, …

2
MySQL:左外部联接和内部联接之间哪个联接更好
如果所有连接都提供相同的结果,哪个连接比较好执行?例如,我有两个表employees(emp_id,name, address, designation, age, sex)和work_log(emp_id,date,hours_wored)。为了得到一些特定的结果,inner join并left join给出相同的结果。但是,我还有一些疑问,不仅限于这个问题。 在结果值相同的情况下,哪个连接更有效? 申请加入时还必须考虑哪些其他因素? 内部联接和交叉联接之​​间有什么关系吗?

2
由于行估计非常不准确,导致全文搜索速度缓慢
对该数据库进行全文查询(存储RT(请求跟踪程序)票证)似乎需要很长时间才能执行。附件表(包含全文数据)约为15GB。 数据库模式如下,大约有200万行: rt4 =#\ d +附件 表“ public.attachments” 专栏 类型 修饰符| 储存| 描述 ----------------- + ----------------------------- +- -------------------------------------------------- ------ + ---------- + ------------- id | 整数| 不是null默认nextval('attachments_id_seq':: regclass)| 普通 transactionid | 整数| 不为空| 普通 父| 整数| 不为null默认值0 | 普通 messageid | 角色变化(160)| | 扩展| 主题| 字符变化(255)| | 扩展| 文件名| 字符变化(255)| …

2
对Parallel Scalar UDF的支持是否合理?
相当有据可查的是,标量UDF强制执行总体串行计划。 并行运行功能 鉴于大量行进入必须计算UDF的管道中的某个点,为什么引擎不能只在处理器之间分配它们呢?如果UDF中没有状态,则顺序无关紧要。 有人声称UDF是黑匣子,必须使用游标。我可以看到,在两次迭代之间保持某种状态的情况下,用户游标无法在SP内并行化,但是看起来应该可以并行化。 解释引擎为何强制整个计划按顺序进行而不是仅由UDF计算阶段进行的加分。 对并行UDF的支持是否是要求的合理功能?

5
使用INSERT_IDENTITY插入select到多个相关表中
好,设置场景。我有三个表,( Table1,Table2和DataTable),我想插入Table1和Table2使用DataTable作为源。所以对于每一行DataTable我都想要在Table1和中一行Table2,并且Table2需要id从Table1...中插入(PK)。 如果我要这样做... INSERT INTO Table1 SELECT A, B, C FROM MyTable INSERT INTO Table2 SELECT IDENTITY_INSERT(), D, E, F FROM MyTable 我将获得ID最后插入的记录的Table1。 是CURSORor WHILE循环的唯一方法吗?

6
估计预计的数据库增长
我最近开始以DBA培训生的身份使用SQL Server 2008。我需要计算数据库的大小,还需要估计数据库在最近几个月的增长以及未来12个月的预测增长。 我可以使用sp_spaceused语句来计算实际大小,但是如何计算其他所有内容?

2
外键约束违规问题
我确定了3种情况。 没有入学的学生。 有入学但没有成绩的学生。 具有入学和成绩的学生。 注册表上有一个触发器来计算GPA。如果学生有成绩,它将更新或在GPA表中插入一个条目;没有成绩,没有GPA表条目。 我可以删除没有注册的学生(#1)。我可以删除具有入学和成绩的学生(以上#3)。但是我不能删除没有注册但没有成绩的学生(#2)。我收到了参考约束违规。 DELETE语句与REFERENCE约束“ FK_dbo.GPA_dbo.Student_StudentID”冲突。在数据库“”,表“ dbo.GPA”的“ StudentID”列中发生了冲突。 如果我无法删除没有注册(也没有GPA条目)的新学生,那么我会理解违反约束的条件,但是我可以删除该学生。这是一个学生,没有注册并且没有成绩(我也没有GPA条目),我无法删除。 我已修补好扳机,因此可以继续前进。现在,如果您已注册,则无论如何触发器都会将您插入GPA表。但是我不理解潜在的问题。任何解释将不胜感激。 物有所值: Visual Studio 2013专业版。 IIS Express(VS2013内部)。 使用EntityFramework 6.1.1的ASP.NET Web App。 MS SQL Server 2014企业版。 GPA.Value可为空。 Enrollment.GradeID为空。 这是数据库的一个片段: - 编辑 - 这些表都是由EntityFramework创建的,我使用SQL Server Management Studio生成了这些表。 这是带有约束的创建表语句: GPA 表: CREATE TABLE [dbo].[GPA]( [StudentID] [int] NOT NULL, [Value] [float] NULL, CONSTRAINT …

3
InnoDB导入性能
我在批量导入一个由大约1000万行(或7GB)组成的相当大的InnoDB表时遇到了麻烦(对我来说,这是迄今为止我使用过的最大表)。 我做了一些研究来提高Inno的导入速度,目前我的设置如下所示: /etc/mysql/my.cnf/ [...] innodb_buffer_pool_size = 7446915072 # ~90% of memory innodb_read_io_threads = 64 innodb_write_io_threads = 64 innodb_io_capacity = 5000 innodb_thread_concurrency=0 innodb_doublewrite = 0 innodb_log_file_size = 1G log-bin = "" innodb_autoinc_lock_mode = 2 innodb_flush_method = O_DIRECT innodb_flush_log_at_trx_commit=2 innodb_buffer_pool_instances=8 import is done via bash script, here is the mysql code: SET …

1
为什么对具有INSTEAD OF UPDATE触发器的表进行UPDATE似乎会执行聚集索引插入以及聚集索引更新?
我将从一个非常简单的示例开始:两个表都具有相同的模式,它们都聚集在PK上,但是其中一个具有INSTEAD OF UPDATE触发器: CREATE TABLE Standard ( PK UNIQUEIDENTIFIER PRIMARY KEY CLUSTERED, V INT NOT NULL ) GO CREATE TABLE InsteadOf ( PK UNIQUEIDENTIFIER PRIMARY KEY CLUSTERED, V INT NOT NULL ) GO INSERT Standard (PK, V) VALUES ('1E58B555-B073-471E-B576-4B09C8E18976', 0) INSERT InsteadOf (PK, V) VALUES ('1E58B555-B073-471E-B576-4B09C8E18976', 0) GO CREATE TRIGGER …

1
事务隔离级别快照与截断?
我希望有人可以阐明我在SNAPSHOT隔离与TRUNCATE上没有想到的这种行为。 数据库:允许快照隔离= True;读取已提交快照快照= False。 Procedure1(从具有大量连接的长时间运行的复杂SELECT替换表foo的内容): BEGIN TRAN; TRUNCATE TABLE foo; INSERT INTO foo SELECT...; COMMIT; Procedure2(从表foo中读取): SET TRANSACTION ISOLATION LEVEL SNAPSHOT; SELECT * FROM foo; 如果在执行Procedure2的同时正在运行Procedure1,则过程2将等待LCK_M_SCH_S(根据sp_WhoIsActive)等待,直到Procedure1完成。而当Procedure2确实完成时,它将引发此异常: 快照隔离事务在数据库'DatabaseName'中失败,因为自该事务开始以来,该语句访问的对象已由另一个并发事务中的DDL语句修改。不允许这样做,因为未对元数据进行版本控制。如果同时进行元数据更新和快照隔离,则可能导致不一致。 但是,Microsoft并未将TRUNCATE列为SNAPSHOT隔离下不允许的DDL语句:http : //msdn.microsoft.com/zh-cn/library/bb933783.aspx 显然,我并没有正确理解某些东西,因为我希望程序2的最佳情况会在TRUNCATE之前立即返回表中最近提交的数据,或者最坏的情况是被程序1阻止,然后返回程序的新内容。表。你能帮我吗?

1
哈希/排序溢出到tempdb中的频率是多少?
我们的企业应用程序使用SQL Server进行数据存储,并且主要是OLTP系统。但是,我们应用程序的重要组成部分会产生大量的OLAP工作负载。 我们对tempdb的写入延迟约为100毫秒。这种趋势发展随着时间的推移,和ALLOW_SNAPSHOT_ISOLATION关断。我们正在对有关此问题的问题进行故障排除,到目前为止,我们发现的唯一有趣的事情是,有大量散列和排序溢出到tempdb。我们推测这是来自我们的OLAP工作负载。 题 涉及什么频率的泄漏?任何?每秒多少溢出?我们的初步数据表明,每秒大约有2次哈希溢出,每分钟大约25次分类溢出。 这种溢出的频率是否可能成为我们高tempdb写延迟的主要原因? 其他资讯 根据内核数的建议,我们正在为tempdb使用多个文件。tempdb文件位于RAID 1 + 0 SAN(具有高性能SSD)上,但与主DB数据和日志文件位于同一设备上。tempdb文件的大小足够大,以至于它们很少增长。我们没有使用跟踪标志1117或1118。另一个变量是,此设置被许多不同的数据库共享,这些数据库都承受着中到高负载。 我们的100 ms写延迟远远大于我们在MSDN,SQL Skills和其他站点上找到的tempdb写延迟可接受的范围。但是,其他数据库的写入延迟很好(小于10ms)。基于其他统计数据,看来我们在大量使用tempdb,尤其是对于内部对象。因此,我们正在深入研究以找出为什么我们的应用程序如此大量地使用内部对象。 我们的平台上确实存在实际性能问题,这些问题以不同的方式体现出来。我们一直在监视性能计数器,查看DM视图,并分析我们的应用程序行为,以尝试挖掘系统的资源使用特征。我们现在专注于溢出,因为我们已经了解到溢出具有严重的负面影响,因为它们是在磁盘上而不是在内存中执行的。而且我们似乎有大量的泄漏事件,但是我想就人们认为“高泄漏”的问题征求一些意见。

2
使用PL / pgSQL函数返回记录-加快查询速度
我有一个用Perl编写的非分叉游戏守护进程,该守护进程使用acync查询将玩家统计信息写入PostgreSQL 9.3数据库。但是,当我需要从数据库中读取某些内容时(例如,如果某个播放器被禁止或该播放器具有VIP状态),那么我将使用同步查询。 这使游戏停止片刻,直到从数据库中读取了该值。 我无法重写游戏守护进程以使用异步查询来读取值(我尝试过,但是需要太多更改),所以我的问题是:合并几个不相关的查询(当一个新玩家使用时,我需要进行查询)是否有意义连接)到1过程,我如何同时向我的Perl程序返回几个值? 我当前的所有查询都以玩家ID作为参数并返回1值: -- Has the player been banned? select true from pref_ban where id=? -- What is the reputation of this player? select count(nullif(nice, false)) - count(nullif(nice, true)) as rep from pref_rep where id=? -- Is he or she a special VIP player? select vip > now() …

1
在表上创建MySQL索引失败
更新:tl; dr:问题是MySQL TMPDIR在创建索引时使用。而我TMPDIR的磁盘空间不足。 原始问: 我正在尝试向InnoDB表添加索引,并获得一个table is full error。我有足够的磁盘空间,MySQL配置的文件表数量为1。表数据为85GB,我假设索引约为20GB-30GB,并且我的磁盘空间要大得多。我也在使用ext3,因此从操作系统的角度来看,文件大小限制没有任何问题。 记录的错误如下所示: 140616 13:04:33 InnoDB: Error: Write to file (merge) failed at offset 3 1940914176. InnoDB: 1048576 bytes should have been written, only 970752 were written. InnoDB: Operating system error number 0. InnoDB: Check that your OS and file system support files of …
10 mysql  innodb  index 

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.