数据库管理员

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

2
SQL Server数据工具和分区功能
我正在创建一个滑动窗口加载方案,并且分区功能将随着时间改变其边界。 我已经在SQL Server数据工具(SSDT)数据库项目中创建了一些分区功能,并使用一些硬编码的初始边界。 但是,随着时间的流逝以及分区功能的边界发生变化,未来的SSDT数据库发布会将边界恢复为原始边界。 是否有某种方法可以通过禁用分区功能的发布来优雅地处理此情况? 我尝试将SSDT中分区功能的Build Action属性从default更改Build为None,但是由于依赖对象中缺少引用,因此项目无法构建。
16 sql-server 

6
数据库规范化已死吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 已关闭6年。 我从小就读过-我们学会了在应用程序的业务层之前设计数据库架构(或使用OOAD进行其他所有操作)。我在设计模式(IMHO :)方面一直做得很好,并且进行规范化只是为了删除不必要的冗余,而没有在影响速度的地方进行标准化,即,如果联接对性能造成了影响,则冗余就留在了原处。但大多数情况并非如此。 随着一些ORM框架(如Ruby的ActiveRecord或ActiveJDBC)的出现(还有我不记得的其他几个,但是我敢肯定有很多),似乎他们更喜欢为每个表使用代理键,即使有些表具有主键,例如'电子邮件'-彻底破坏2NF。好的,我了解不多,但是当其中一些ORM(或程序员)不承认1-1或1-0 | 1(即1到0或1)时,我(几乎)感到不安。他们规定,最好将所有内容都放在一张大桌子上,而不管它是否有大量的nulls “当今系统可以处理它”,这是我经常听到的评论。 我同意内存限制确实与规范化有直接关系(还有其他好处:),但是在 当今廉价的内存和四核计算机的时代,DB规范化的概念是否留给文本?作为DBA,您是否仍在对3NF(如果不是BCNF :)进行标准化?有关系吗?“脏模式”设计是否适合生产系统?如果仍然有意义,应该如何为“归一化”提出理由。 (注意:我不是在谈论数据仓库的星型/雪花模式,这种模式作为设计的一部分/需求是冗余的,但是带有后端数据库(例如StackExchange)的商业系统)


4
PostgreSQL 9.1热备份错误:数据库系统正在启动
我一直在为Postgres 9.1进行热备份,并且遇到了一个一致的问题。在从属服务器上重新启动Postgres后,pgstartup日志文件和pg_log目录下的每日日志文件将正确读取。但是,当我尝试使用psql命令进入数据库时​​,出现错误: 严重:数据库系统正在启动。 recovery.conf文件也不会变为recovery.done。我已经广泛研究了此错误,并始终找到相同的响应:在尝试重新启动Postgres之前,尚未彻底关闭数据库。我重新启动Postgres的唯一方法是通过service postgresql-9.1 restartor /etc/init.d/postgresql-9.1 restart命令。收到此错误后,我将终止所有进程,然后再次尝试重新启动数据库,但仍然收到相同的错误。我不知道从哪里去以及如何解决此问题。以下是完成热备份的确切过程。 主服务器配置: pg_hba.conf,添加以下行: 主机复制postgres IPAddressOfSlaveServer信任 postgresql.conf: wal_level = hot_standby max_wal_senders = 5 listen_address ='*' 端口= 5432 max_wal_senders = 5 wal_keep_segments = 32 从服务器配置: postgresql.conf: hot_standby =开启 recovery.conf: Standby_mode =开 primary_conninfo =主机= IPAddressOfMasterServer 端口= 5432 用户= postgres restore_command ='cp /var/lib/pgsql/9.1/data/pg_xlog/%f“%p”' 配置两个服务器之后 我更改为主服务器上的postgres用户并运行以下命令: psql -c“选择pg_start_backup('label',true);”; …
16 postgresql 

2
简单联接中未使用的主键索引
我有以下表和索引定义: CREATE TABLE munkalap ( munkalap_id serial PRIMARY KEY, ... ); CREATE TABLE munkalap_lepes ( munkalap_lepes_id serial PRIMARY KEY, munkalap_id integer REFERENCES munkalap (munkalap_id), ... ); CREATE INDEX idx_munkalap_lepes_munkalap_id ON munkalap_lepes (munkalap_id); 为什么在以下查询中不使用munkalap_id上的索引? EXPLAIN ANALYZE SELECT ml.* FROM munkalap m JOIN munkalap_lepes ml USING (munkalap_id); QUERY PLAN Hash Join (cost=119.17..2050.88 …

3
将RDS-MySQL复制到非Amazon主机吗?
我有一个相当大的MySQL(5.1)数据库在Amazon中作为RDS实例运行。我正在努力将其从Amazon迁移出去。为了顺利地做到这一点,我想将新硬件设置为RDS实例的只读副本。 我知道RDS支持RDS内的复制。有什么方法可以配置它以复制到不在RDS中的主机?

1
使用RECOMPILE查询提示时查询之间执行时间的巨大差异
我在同一SQL Server 2005实例上运行两个几乎相同的查询: 第一个是SELECTLINQ生成的原始查询(我知道,我知道...我不是应用程序开发人员,只是DBA :)。 第二个与第一个完全相同,最后添加一个OPTION (RECOMPILE)。 没有其他改变。 第一次运行需要55秒。 第二个需要2秒。 两个结果集是相同的。 为什么这个提示会带来如此惊人的性能提升? 的在线丛书条目RECOMPILE未提供详细的解释: 指示SQL Server数据库引擎在执行后放弃为查询生成的计划,从而迫使查询优化器在下次执行同一查询时重新编译查询计划。在不指定RECOMPILE的情况下,数据库引擎缓存查询计划并重新使用它们。编译查询计划时,RECOMPILE查询提示将使用查询中任何局部变量的当前值;如果查询在存储过程中,则将当前值传递给任何参数。 当只需要重新编译存储过程中的一部分查询而不是整个存储过程时,RECOMPILE是创建使用WITH RECOMPILE子句的存储过程的有用替代方法。有关更多信息,请参见重新编译存储过程。创建计划指南时,RECOMPILE也很有用。有关更多信息,请参见使用计划指南优化已部署应用程序中的查询。 由于我的查询有很多局部变量,因此我猜测当我使用OPTION (RECOMPILE)查询提示时,SQL Server能够(严重)优化它。 我到处看的人都说OPTION (RECOMPILE)应该避免。对此的解释通常是,使用此提示,SQL Server无法重用此执行计划,因此必须浪费时间每次重新编译它。(但是)鉴于巨大的性能优势,我倾向于认为这次使用此查询提示将是一件好事。 我应该使用它吗?如果没有,是否有一种方法可以强制SQL Server在没有此提示且不更改应用程序的情况下使用更好的执行计划?

5
测试是否有任何列为NULL
我试图找出一个简单的查询,我可以测试一个大表是否具有在ANY列中至少具有一个空白(NULL /空)值的条目列表。 我需要类似的东西 SELECT * FROM table AS t WHERE ANY(t.* IS NULL) 我不想做 SELECT * FROM table AS t WHERE t.c1 = NULL OR t.c2 = NULL OR t.c3 = NULL 这将是一个巨大的查询。

2
使用动态SQL在指定的数据库中创建视图?
我正在写一个动态sql,以在不同的数据库中删除并创建视图。 所以我写道: set @CreateViewStatement = ' USE ['+ @DB +']; CREATE VIEW [dbo].[MyTable] AS SELECT ........something exec (@CreateViewStatement) 它给我错误: “ CREATE VIEW”必须是查询批处理中的第一条语句。 如果我删除USE DATABASE语句,它可以正常工作,但是不再指定数据库了。 我怎么解决这个问题?

1
数据库如何存储可变长度字段的索引键值(在磁盘上)?
语境 这个问题与SQL和NoSQL数据库系统中索引的低级实现细节有关。索引的实际结构(B +树,哈希,SSTable等)无关紧要,因为该问题专门涉及存储在任何这些实现​​的单个节点内的键。 背景 在SQL(如MySQL的)和NoSQL(CouchDB的,MongoDB的,等等)数据库,如果您在列或数据的JSON文档字段建立索引,你实际上是导致数据库做的就是创建本质上所有的排序列表这些值以及与该值有关的记录所在的主数据文件中的文件偏移量。 (为简单起见,我可能会手动放弃特定展示的其他深奥细节) 简单经典SQL示例 考虑一个标准的SQL表,该表具有一个简单的32位int主键,我们可以在该主键上创建索引,我们最终将获得一个排序后的整数键的索引在磁盘上的索引,并与数据文件中的64位偏移量相关联,其中记录的生命,例如: id | offset -------------- 1 | 1375 2 | 1413 3 | 1786 索引中键的磁盘上表示形式类似于以下内容: [4-bytes][8-bytes] --> 12 bytes for each indexed value 坚持使用文件系统和数据库系统优化磁盘I / O的标准经验法则,假设您将密钥存储在磁盘上的4KB块中,这意味着: 4096 bytes / 12 bytes per key = 341 keys per block 忽略索引的整体结构(B +树,哈希,排序列表等),我们一次将341个键的块读写到内存中,然后根据需要返回到磁盘。 查询范例 使用上一部分中的信息,假设有一个查询“ id …
16 mongodb  index  nosql  couchdb 

3
在没有WAL归档的情况下,PostgreSQL 9.1流复制是否会滞后?
内容: 假设在Postgres 9.1群集上使用流复制/热备用时,备用节点将关闭。它停了一天,在此期间主服务器上发生了许多DML。备用数据库的recovery.conf不包含“ restore_command”条目(用于从WAL日记文件还原),但是包含“ primary_conninfo”字符串(用于流复制)。 题: 如果我在主服务器上进行了一天的更改后再次启动了备用服务器。是否仅使用流复制来“赶上”(最终进入与主服务器类似的状态)?还是我必须启用WAL文件归档并让其应用在中断期间归档的文件以确保币种? 我在此处检查了WAL归档/流复制文档,它说您不必同时启用WAL归档和流复制,但是尚不清楚在不启用WAL文件归档的情况下是否会发生追赶。 谢谢!

1
MySQL如何从存储过程返回结果集?
我正在努力弄清楚在Web应用程序中使用的存储过程。在我看来,MySQL存储过程中的最后一条语句似乎都被视为该过程的结果集。但是不幸的是,MySQL文档中似乎有一些引用说一个过程可以返回多个结果集。如何触发此行为?如何告诉MySQL服务器我明确希望只返回一个结果集? (例如,我有一个执行SELECT和一些插入的查询。我不想告诉客户有关插入的信息,但是我确实希望为客户提供SELECT的结果集。...)

2
检索日期范围的最有效方法
用这种表结构检索日期范围的最有效方法是什么? create table SomeDateTable ( id int identity(1, 1) not null, StartDate datetime not null, EndDate datetime not null ) go 假设您要同时为StartDate和设置一个范围EndDate。因此,换句话说,如果StartDate介于@StartDateBegin和之间@StartDateEnd,并且EndDate介于@EndDateBegin和之间@EndDateEnd,则执行某些操作。 我知道有几种方法可以解决此问题,但是最建议的是什么?


3
“将来”是否有更好的方法退出MySQL InnoDB日志?
我在MySQL 5.0中遇到此InnoDB错误。Mysqld干净地停止了,但是后来我设法丢失了ib_logfile0和ib_logfile1。现在,在干净启动之后,InnoDB已经完成了“崩溃恢复”。我经历了innodb_force_recovery = 4业务,修复了一个挂起的MyISAM表,除此之外,现在可以进行复制了。大数字表示: 111116 15:49:36 InnoDB: Error: page 393457 log sequence number 111 561,760,232 InnoDB: is in the future! Current system log sequence number 70 3,946,969,851. InnoDB: Your database may be corrupt or you may have copied the InnoDB InnoDB: tablespace but not the InnoDB log files. See InnoDB: …
16 mysql  innodb 

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.