数据库管理员

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

3
大批量插入速度
在我的应用程序中,我的INSERT似乎花费了大量时间。我有大量的对象(〜40-50,000)要插入表中。 让我们拿一个样品表 CREATE TABLE bill ( id BIGINT(20) PRIMARY KEY, amount INT(11) DEFAULT 0, bill_date DATETIME DEFAULT NOW(), INDEX (bill_date) ) ENGINE=InnoDB 以3行作为我的批处理大小,以下是我可以想到的插入方法 方法1-构造并击发3个原始插件 INSERT INTO bill (amount, bill_date) VALUES (10, '2012-01-01 00:00:00'); INSERT INTO bill (amount, bill_date) VALUES (20, '2012-01-02 00:00:00'); INSERT INTO bill (amount, bill_date) VALUES (40, '2013-02-05 …
10 mysql  innodb  insert  java  jdbc 

1
如何防止SQLite数据库锁定?
从SQLite FAQ中,我知道: 多个进程可以同时打开同一个数据库。多个进程可以SELECT同时进行。但是,在任何时候,只有一个进程可以对数据库进行更改。 所以,据我了解,我可以:1)从多个线程读取DB(SELECT)2)从多个线程读取DB( SELECT)和write从单个线程(CREATE,INSERT,DELETE) 但是,我读到有关预写日志记录的问题,它提供了更多的并发性,因为读者不会阻止作者,而作家也不会阻止读者。读写可以同时进行。 最后,当我找到它时,我已经完全糊涂了: 这是导致SQLITE_LOCKED错误的其他原因: 试图CREATE或DROP表或索引而SELECT声明仍悬而未决。 当a SELECT在同一表上处于活动状态时,尝试写入该表。 SELECT如果未将sqlite设置为在多线程应用程序中尝试在同一表上同时执行两个操作。 对数据库文件的fcntl(3,F_SETLK调用失败。例如,这可能是由NFS锁定问题引起的。针对此问题的一种解决方案是将DB移开,然后将其复制回来,使其具有新的Inode值 那么,我想为自己澄清一下,有必要避免锁吗?我可以同时从两个不同的线程读写吗?谢谢。
10 locking  sqlite 

3
使用命令行更改PostgreSQL端口
我的PostgreSQL默认端口是5432,我想使用命令行更改默认端口(在Windows 7中)。 我之前看到过这个解决方案:https : //stackoverflow.com/questions/187438/want-to-change-pgsql-port 我尝试运行以下命令,但失败: postgres --p 5431 有人可以告诉我如何使用命令行更改端口吗?

3
识别哪些值与表格行不匹配
我希望能够轻松地检查表中不存在查询中提供的唯一标识符。 为了更好地解释,这是我现在要执行的操作,以检查表中不存在列表“ 1、2、3、4”的哪些ID: SELECT * FROM dbo."TABLE" WHERE "ID" IN ('1','2','3','4'),假设该表格不包含ID为2的行。 将结果转储到Excel 在原始列表上运行VLOOKUP,以搜索结果列表中的每个列表值。 任何导致的VLOOKUP都#N/A位于表中未出现的值上。 我在想必须有一种更好的方法来做到这一点。理想情况下,我正在寻找类似 要检查的列表->在表上查询以检查->列表中的成员不在表中


2
如何将分钟添加到时间数据类型?
我有一个存储过程,该过程将两个记录插入到一​​个表中,记录之间的区别是第二个记录的时间列在第一个记录@MinToAdd之后: CREATE PROCEDURE CreateEntry /*Other columns*/ @StartTime time(2), @EndTime time(2), @MinutesToAdd smallint AS BEGIN SET NOCOUNT ON; SET @MinutesToAdd = @MinutesToAdd % 1440; --Prevent overflow if needed? IF (@MinutesToAdd > 0) BEGIN INSERT INTO ClientNotification (/*Other columns*/ startTime, endTime) OUTPUT inserted.id VALUES (/*Other columns*/ @StartTime, @EndTime), (/*Other columns*/ @StartTime + …

1
pg_dump和错误:吐司值缺少块编号0
我正在使用PostgreSQL 8.4.15。在运行pg_dump数据库备份时,出现以下错误: pg_dump: SQL command failed pg_dump: Error message from server: ERROR: missing chunk number 0 for toast value 123456789 in pg_toast_987654321 pg_dump: The command was: COPY public.my_table (id, .... all the columns ...) 搜索此错误消息时,我发现了一些引用(此处和此处),它们建议为表重新编制索引。(在这些讨论中,有一个查询pg_class表的参考以找到正确的pg_toast_XXXXXX值,但似乎是因为在错误消息中未显示该值。我跳过了这一部分,因为在错误消息中显示了一个值我想这可能是因为PostgreSQL的更高版本而带来的便利。) 我执行以下操作: REINDEX table pg_toast.pg_toast_987654321; VACUUM ANALYZE my_table; 我现在可以正确使用pg_dump。 什么是pg_toast什么也这个命令的作用呢?这些仅仅是为了简单清理,还是可以摆脱该表中的某些行?首先是什么引起了该问题? 该表中大约有300000行,但是我希望自从上一次成功备份以来,大约只有250个新行(此表仅用于INSERT / SELECT,没有UPDATE)。
10 postgresql 

3
SQL Server数据库分片-如何处理公用数据/非分片数据
我们有一个非常大型的企业级数据库。作为我们业务模型的一部分,所有Web用户每个月都在同一时间访问我们的Web服务器,这反过来又会破坏我们的sql框。业务量非常大,并且随着公司规模的增长,流量还会继续增加。已执行sql proc优化,并且硬件已经扩展到很高的水平。 我们正在寻求对数据库进行分片,以确保我们能够处理公司的增长和未来的负载。 我们已决定应分拆哪些特定数据。它是我们数据库的一个子集,利用率很高。 但是,我的问题是关于通用/通用的非分片数据。这样的数据示例可能是一个库存表(例如),也可能是雇员表,用户表等。 我看到两个选项来处理此通用/通用数据: 1)设计1-将通用/通用数据放置在外部数据库中。所有写入将在此处发生。然后,该数据将被复制到每个分片中,从而允许每个分片在t-sql proc中读取此数据并内部联接至此数据。 2)设计2-为每个分片提供所有常见/通用数据的自己的副本。让每个分片在本地写入这些表,并利用sql合并复制来更新/同步所有其他分片上的数据。 对设计#1的担忧 1)事务性问题:例如,如果您必须先在一个分片中写入或更新数据,然后再在1个存储的proc中写入/更新一个通用/通用表,那么您将无法再轻松地做到这一点。现在,数据存在于单独的sql实例和数据库上。您可能需要让MS DTS来查看是否可以将这些写操作包装到事务中,因为它们位于单独的数据库中。在这里,性能是一个问题,可能会对写入分片和公共数据的proc进行重写。 2)失去参照完整性。不可能做到跨数据库引用完整性。 3)重新编码系统的大部分区域,以便它知道将公共数据写入新的通用数据库,但从分片中读取公共数据。 4)。增加数据库旅行。像上面的#1一样,当您遇到必须更新分片数据和公用数据的情况时,由于数据现在位于单独的数据库中,因此您将进行多次往返以完成此操作。这里有些网络延迟,但是我不像上面的3一样担心这个问题。 对设计2的担忧 在设计2中,每个分片都拥有自己的所有通用/通用数据实例。这意味着加入或更新公共数据的所有代码将像今天一样继续工作/运行。开发团队几乎不需要进行任何编码/重写。但是,此设计完全依赖合并复制来使所有分片之间的数据保持同步。dbas非常熟练,并且非常担心合并复制可能无法处理此问题,并且合并复制失败,因此从该失败中恢复并不好,并且可能会对我们造成负面影响。 我很想知道是否有人采用了第二种设计方案。我也很好奇我是否忽略了我没有看到的第三或第四设计方案。 先感谢您。
10 sql-server 

2
截断/大插入后是否应该重建索引?
我有一个存储过程,它会在插入新数据(基于其他表中的数据,计算等)之前,截断每个表中各有约175万行的某些表。 基本轮廓非常简单: 截断表 在大约75,000的“批次”中插入175万行。 我想知道是否应该在此过程中的任何时候显式重建索引?例如 截断表 ALTER INDEX ALL ON xxx REBUILD WITH (FILLFACTOR=90) [或类似的东西] 插入175万行 也许 ALTER INDEX ALL ON xxx DISABLE 截断表 插入175万行 ALTER INDEX ALL ON xxx REBUILD WITH (FILLFACTOR=90) [或类似的东西] 非常感谢任何帮助...不是DBA-知道DB很好的开发人员会更准确!

1
在MySQL中批处理UPDATE查询的最有效方法是什么?
我正在编写一个应用程序,该应用程序需要长时间刷新数据库的大量更新,而我一直沉迷于如何优化查询。目前,我正在使用INSERT INTO ... VALUES (..), (..) ON DUPLICATE KEY UPDATE,它可以将所有值批处理到一个查询中,但是在大型表上执行速度非常慢。我实际上从来不需要插入行。 我见过的其他方法是使用更新SET value = CASE WHEN...(由于我构建查询的方式而很难生成,并且我不确定CASE数百/数千个键的性能),并且只是多个连接更新。这些方法都比我目前的方法快吗? 据我所知,在MySQL中没有一种惯用的,有效的方法可以使我感到困惑。如果确实没有比更快的方法ON DUPLICATE KEY,是否值得切换到PostgreSQL并使用其UPDATE FROM语法? 任何其他建议也将不胜感激! 编辑:这是经常更新的表之一。由于它们不相关,因此我删除了列名。 CREATE TABLE IF NOT EXISTS `table` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `a` bigint(20) unsigned NOT NULL DEFAULT '0', `b` bigint(20) unsigned NOT NULL DEFAULT '0', `c` enum('0','1','2') …
10 mysql  update 


2
选择/插入死锁
此实例承载SharePoint 2007数据库(SP)。我们一直在针对SP内容数据库中一个频繁使用的表遇到许多SELECT / INSERT死锁。我缩小了涉及的资源,这两个过程都需要对非聚集索引进行锁定。INSERT在SELECT资源上需要IX锁,而SELECT在INSERT资源上需要S锁。死锁图描述了三个资源:1。SELECT中的两个(生产者/消费者并行线程)和2.)INSERT。我附上了死锁图供您查看。因为这是Microsoft代码和表结构,所以我们无法进行任何更改。 但是,我已经在MSFT SP站点上阅读了他们建议将MAXD​​OP实例级别的配置选项设置为1。由于此实例在许多其他数据库/应用程序之间共享,因此不能禁用此设置。 因此,我决定尝试防止这些SELECT语句并行执行。我知道这不是解决方案,而是临时的修改,以帮助进行故障排除。因此,这样做后,我将“并行计算的成本阈值”从我们的标准25提高到了40,即使工作负载没有改变(SELECT / INSERT频繁发生),死锁也消失了。我的问题是为什么? SPID 356 INSERT在属于非聚集索引的页面上具有IX锁 SPID 690 SELECT执行ID 0在属于同一非聚集索引的页面上具有S锁 现在 SPID 356希望在SPID 690资源上获得IX锁,但由于SPID 356被SPID 690执行ID 0阻止而无法获得IX锁 SPID 690执行ID 1希望在SPID 356资源上获得S锁,但由于SPID 690执行ID无法获得它SPID 356阻止了1,现在我们陷入僵局。 执行计划可以在我的SkyDrive上找到 完整的死锁详细信息可以在这里找到 如果有人可以帮助我理解为什么我会非常感激。 EventReceivers表。 id uniqueidentifier否16 名称nvarchar否512 SiteId uniqueidentifier否16 WebId uniqueidentifier否16 HostId uniqueidentifier否16 HostType int否4 ItemId int否4 DirName nvarchar否512 LeafName nvarchar否256 …

3
用户无法在SSMS中以非默认模式查看表
我在VIEW DEFINITION为一个用户的架构级别适当设置权限时遇到问题。我已经创建了架构TestSchema并添加了一些表。用户目前有权限设置为访问和修改表(SELECT,UPDATE,DELETE通过等)dbo_datareader和dbo_datawriter角色。但是,他们看不到SSMS对象资源管理器中的任何表。 我尝试授予查看定义的权限: grant view definition on SCHEMA :: [TestSchema] to [User] 那没用。我尝试设置表级权限: grant view definition on [TestSchema].[NewTable] to [User] 那也没有用。然后,我尝试了一项总括性赠款: grant view definition to [User] 那确实奏效了;他们现在可以看到TestSchema以及他们不应该访问的其他模式。 我的目标是允许用户查看给定架构中的所有表。我该怎么做?如果默认情况下我应该能够执行此操作,那么我应该查看哪些权限以查找为什么不能这样做?

1
配置文件死锁报告中的“ * password ------------”是什么意思?
在SQL Server 2008 R2中,我得到了几个死锁报告,它们在输入缓冲区中具有“ * password ------------”。它看起来像是攻击,但在那种情况下,我不知道攻击的原因或类型。 (该日志是由专家DBA生成的,他有很多经验,并告诉我,不是我) 有谁知道它是什么?谢谢! 例: <?xml version="1.0"?> <blocked-process> <process id="process879948" taskpriority="0" logused="0" waitresource="KEY: 5:72057602473263104 (1d69201d0ba6)" waittime="5185" ownerId="88389135" transactionname="SELECT" lasttranstarted="2012-09-25T18:11:02.507" XDES="0x1f7d2a590" lockMode="S" schedulerid="2" kpid="4552" status="suspended" spid="86" sbid="2" ecid="0" priority="0" trancount="0" lastbatchstarted="2012-09-25T18:11:02.507" lastbatchcompleted="2012-09-25T18:11:02.507" lastattention="2012-09-25T18:07:35.740" clientapp=".Net SqlClient Data Provider" hostname="IP-xxxxxxxx" hostpid="4868" loginname="sa" isolationlevel="read committed (2)" xactid="88389135" currentdb="1" lockTimeout="4294967295" …

1
HDD崩溃后启动PostgreSQL服务器会导致FAILED STATE
我使用Fedora 15带PostgreSQL 9.1.4。Fedora最近崩溃了,之后: 尝试启动PostgreSQL服务器: service postgresql-9.1 start 给 Starting postgresql-9.1 (via systemctl): Job failed. See system logs and 'systemctl status' for details. [FAILED] 虽然,在系统重启后第一次启动服务器时,服务器可以正常启动。 但是,尝试使用psql会出现此错误: psql: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"? .s.PGSQL.5432文件在系统上任何地方都不存在。A …
10 linux  postgresql 

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.