数据库管理员

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

5
用于“巨大”数据库表PK的顺序GUID或bigint
我知道这类问题很多,但是我还没有阅读任何有说服力的论点来帮助我做出这个决定。请多多包涵! 我有一个庞大的数据库-它每天增长大约10,000,000条记录。数据是关系数据,出于性能原因,我将表与BULK COPY一起加载。因此,我需要为行生成键,并且不能依赖IDENTITY列。 64位整数(bigint)足够我使用,但是为了保证唯一性,我需要一个集中生成器来为我创建ID。我目前有这样的生成器服务,该服务允许服务保留X序列号并保证不发生冲突。但是,这样做的结果是,我拥有的所有服务都依赖于该集中式生成器,因此我在分配系统方面受到限制,并且对施加的其他依赖项(例如要求网络访问)不满意通过这种设计。有时这是一个问题。 我现在正在考虑使用顺序GUID作为主键(在SQL外部生成)。从我自己的测试中可以确定的是,这些操作的唯一缺点是较宽数据类型的磁盘空间开销(索引中使用它们会加剧这种情况)。与bigint相比,我还没有看到查询性能的任何明显下降。使用“批量复制”加载表的速度稍慢,但幅度不大。得益于我的顺序GUID实现,基于GUID的索引不会变得零散。 基本上,我想知道的是,是否还有我可能忽略的其他注意事项。目前,我倾向于飞跃并开始使用GUID。我绝不是数据库专家,所以我非常感谢任何指导。

1
强制索引假脱机
我知道出于性能原因应避免使用它,但是我正在尝试展示一种情况,以使其演示如何确保不出现。 但是,我最后遇到了索引丢失警告,但是优化器选择不创建临时索引。 我正在使用的查询是 SELECT z.a FROM dbo.t5 AS z WITH(INDEX(0)) WHERE EXISTS ( SELECT y.a FROM dbo.t4 AS y WHERE y.a = z.a ) OPTION (MAXDOP 1); 表模式为: CREATE TABLE dbo.t4 ( a integer NULL, b varchar(1000) NULL, p varchar(100) NULL ); CREATE TABLE dbo.t5 ( a integer NULL, b …

1
PostgreSQL:拒绝关联关系
我对在PostgreSQL中设置权限有些困惑。 我有以下角色: List of roles Role name | Attributes | Member of -----------+------------------------------------------------+----------- admin | Superuser, Create role, Create DB, Replication | {} meltemi | Create role, Create DB | {rails} rails | Create DB, Cannot login | {} myapp | | {rails} 和数据库: List of databases Name | Owner …

1
我可以从SSMS查询制表符分隔的文件吗?
是否可以从Sql Server Management Studio查询制表符分隔的文件以查看其数据,而无需将其保存在任何地方? 我知道您可以BULK INSERT使用制表符分隔的文件,例如: BULK INSERT SomeTable FROM 'MyFile.txt' WITH ( FIELDTERMINATOR = '\t', ROWTERMINATOR = '\n'); 但是,这需要您事先知道各列并创建一个表来保存数据。 我也知道您可以查询其他一些文件类型,例如CSV或Excel,而无需使用OPENROWSET和Excel驱动程序预先定义列,例如: -- Query CSV SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Text;Database=\\Server\Folder\;HDR=Yes;', 'SELECT * FROM MyFile.csv') -- Query Excel SELECT * FROM OPENROWSET('Microsoft.Ace.OLEDB.12.0', 'Excel 8.0;Database=MyFile.xls', 'SELECT * FROM [Sheet1$]') 另外,如果我更改注册表项Format下HKLM\Software\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Text从CSVDelimited到TabDelimitedSQL Server上,上面的CSV查询将正确读取制表符分隔的文本文件,但是它将不再读取逗号分隔的文本文件,所以我不认为我想留下那样 …

3
使用IN()提高查询性能
我有以下SQL查询: SELECT Event.ID, Event.IATA, Device.Name, EventType.Description, Event.Data1, Event.Data2 Event.PLCTimeStamp, Event.EventTypeID FROM Event INNER JOIN EventType ON EventType.ID = Event.EventTypeID INNER JOIN Device ON Device.ID = Event.DeviceID WHERE Event.EventTypeID IN (3, 30, 40, 41, 42, 46, 49, 50) AND Event.PLCTimeStamp BETWEEN '2011-01-28' AND '2011-01-29' AND Event.IATA LIKE '%0005836217%' ORDER BY Event.ID; …

2
大型表的性能调整(SQL Server 2008 R2)
背景: 我在UAT阶段有一个事实表。目标是在Prod中加载5年的数据(预期大小为400 Mn记录)。目前,它只有2年的测试数据。 表功能: 尺寸数〜45 措施〜30 非累加措施和其他专栏〜25 当前数据大小〜2亿(2年数据) 时间视图:3种不同的月视图:财政/日历/调整后的(即同一行可以在不同的月份中落入,具体取决于所寻找的视图) 用户一次只需要一个视图。(即,查询中仅使用一个月列,这使我们无法按时间视图进行分区) 索引:1个自然键聚集索引(8列)。在每个月列上创建3个覆盖非聚集索引的索引,其中包括很少的维度SK(FK)和所有度量。 因此,索引很大(总计190 GB)。 空间不受限制(已分配1 TB) 服务器中有64 GB的RAM。 表压缩也完成了。 要求: 此事实表上的查询应在30秒内给出结果(一般查询选择sum(量度),并按Dim值将少量Dims组组合在一起)。报告直接在此事实表的顶部完成。 问题: 任何包含“索引”中可用列的查询都可以正常工作,但是如果我们包含其他不在“ include ..”中的列,则很糟糕。这需要5-10分钟以上。任何人都可以提出一些解决方案,使其适合我们选择的任何尺寸/列的情况。在这种情况下,索引视图可以提供帮助吗?

1
如何在PostgreSQL中确定池大小和数据库连接之间的最有效点
我们在高峰时段无法处理到数据库服务器的流量。我们正在考虑改进硬件(有关此方面的信息,请参阅此问题),但我们还希望进行池配置和服务器调整。 我们正在开发的应用程序是一款适用于智能手机的基于回合的多人游戏,其后端由带有独角兽的Rails和PostgreSQL 9.1作为数据库。我们目前有60万注册用户,并且由于游戏状态存储在数据库中,因此每隔几秒钟就会进行数千次写入。我们已经使用PgBadger分析了PostgreSQL的日志文件,在关键时刻,我们得到了很多 FATAL: remaining connection slots are reserved for non-replication superuser connections 解决此问题的简单方法是增加postgresql.conf中的max_connections(当前为100) 。我已经阅读了http://wiki.postgresql.org/wiki/Number_Of_Database_Connections,这表明这可能不是正确的选择。在前面的文章中,它指的是在max_connections和pool size之间找到最佳位置。 为了找到这个最佳位置,可以做什么?有没有什么好的工具可以测量max_connections和池大小的不同值的I / O性能? 我们当前的设置是4个游戏服务器,每个服务器有16名独角兽工作者,池大小为5。 这是我们使用的非默认postgres设置: version | PostgreSQL 9.1.5 on x86_64-unknown-linux-gnu,compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit checkpoint_completion_target | 0.9 checkpoint_segments | 60 checkpoint_timeout | 6min client_encoding | UTF8 effective_cache_size | 2GB lc_collate | …
14 postgresql 

2
Oracle PL / SQL是否具有标准的ASSERT例程?
我想使用一种ASSERT例程,其功能与其他语言中发现的例程类似,即一种构造(它是一种过程,语法...) ASSERT( <condition>, <msg>) 这样,当<condition>传入的第一个参数为false时,将使用指定的<msg>描述性消息引发异常。 我知道手工完成这项工作很简单,但是我想问一下DBMS是否提供了一个标准的工具。 必须编写我自己的一个或从3rdy-party包中导入一个是不切实际的,因为我需要它对于我正在研究的每个项目都具有完全可移植性和透明性。


2
列出现有的SQL Server登录名和用户
我知道我们可以使用SQL Server中的GUI来检查登录名和定义的用户,但是想知道如何使用脚本来执行此检查。 我在下面运行查询,但显示了Principal_id,我不确定该如何映射以获取权限级别。 SELECT * FROM Sys.login_token 那么,是否有任何内置存储的proc可以列出登录名和用户及其权限级别? 谢谢。


4
是否可以在具有数百万行的狭窄表上提高查询性能?
我有一个查询,目前平均需要2500毫秒才能完成。我的表很窄,但是有4400万行。我必须选择哪些选项来提高性能,或者说它达到了它的理想水平? 查询 SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats] WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31'; 桌子 CREATE TABLE [dbo].[Heartbeats]( [ID] [int] IDENTITY(1,1) NOT NULL, [DeviceID] [int] NOT NULL, [IsPUp] [bit] NOT NULL, [IsWebUp] [bit] NOT NULL, [IsPingUp] [bit] NOT NULL, [DateEntered] [datetime] NOT NULL, CONSTRAINT [PK_Heartbeats] PRIMARY KEY CLUSTERED ( [ID] …

3
在SQL Server 2012上运行大量SQL查询时系统磁盘空间不足
我是SQL Server 2012的新手,如果有人可以提供帮助,我将不胜感激。我已将大型数据库的副本还原到SQL Server 2012,并且尝试对它运行一些简单查询。 我试图对数据库的136898115行表运行SELECT查询。该SELECT查询只有一个简单WHERE子句。每次我运行此查询时,它都会失败,因为系统磁盘(安装Windows的分区- C:\)的空间不足(此分区只有6GB的可用空间),我不明白为什么。我将tempdb定义在另一个驱动器上,该驱动器具有14 TB以上的可用空间。当然,我的数据库也位于其他驱动器上。 是什么使我的系统分区空间不足?是页面文件吗?

3
分页时SQL Server查询变慢
我在SQL Server 2012中看到以下T-SQL查询的某些奇怪行为: SELECT Id FROM dbo.Person WHERE CONTAINS(Name, '"John" AND "Smith"') ORDER BY Name 仅执行此查询即可在不到两秒钟的时间内获得约1,300个结果(上有全文索引Name) 但是,当我将查询更改为此: SELECT Id FROM dbo.Person WHERE CONTAINS(Name, '"John" AND "Smith"') ORDER BY Name OFFSET 0 rows FETCH NEXT 10 ROWS ONLY 给我10个结果需要20秒钟以上。 以下查询甚至更糟: SELECT Id FROM ( SELECT ROW_NUMBER() OVER (ORDER BY Name) AS …

1
我如何找出*为什么*用户具有某些有效权限?
我知道我可以通过使用sys.fn_my_permissions以下命令查询有效权限: USE myDatabase; SELECT * FROM fn_my_permissions('dbo.myTable', 'OBJECT') entity_name | subentity_name | permission_name ------------------------------------------------ dbo.myTable | | SELECT dbo.myTable | | UPDATE ... 这告诉我当前用户是否对myTabledatabase 具有SELECT,INSERT,UPDATE等权限myDatabase。 是否可以轻松找出用户为何具有这些权限?例如,我很想拥有一个fn_my_permissions_ex输出附加reason列的函数: USE myDatabase; SELECT * FROM fn_my_permissions_ex('dbo.myTable', 'OBJECT') entity_name | subentity_name | permission_name | reason ------------------------------------------------------------------------------------------------------------------------------------ dbo.myTable | | SELECT | granted to database role …

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.