数据库管理员

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

2
扩展PostgreSQL触发器
Postgres如何触发机制扩展? 我们有大型的PostgreSQL安装,并且我们正在尝试使用日志表和TRIGGER来实现基于事件的系统。 基本上,我们想为要通知UPDATE / INSERT / DELETE操作的每个表创建一个TRIGGER。触发该触发器后,它将执行一个函数,该函数将简单地将新行(对事件进行编码)追加到日志表中,然后我们将从外部服务中进行轮询。 在开始使用Postgres TRIGGER之前,我们想知道它们如何扩展:在单个Postgres安装中可以创建多少个触发器?它们会影响查询性能吗?之前有人尝试过吗?

3
创建指向自身的链接服务器
我正在尝试servername\instancename使用以下调用在SQL Server 2014实例上创建链接服务器: EXEC master.dbo.sp_addlinkedserver @server = N'servername\instancename', @srvproduct=N'SQL Server' 我收到错误消息: Msg 15028, Level 16, State 1, Procedure sp_addlinkedserver, Line 82 The server 'servername\instancename' already exists. 根据MSDN的说法,这在SQL Server 2005中可以正常工作。 链接服务器不必是SQL Server的另一个实例, 因此,我不确定最近的版本中有哪些更改不允许这样做。使用UI会生成类似的消息: 您不能将本地SQL Server创建为链接服务器。 我知道请求是一件奇怪的事情,但是它要支持一些在2005年有效的旧代码(以前在单独的实例上使用)。文档指出它应该可以,但是不能。有什么方法可以使其在2014年正常工作,还是我必须修改基础代码?

2
压缩NVARCHAR(MAX)的另一种方法?
我正在尝试压缩一些具有NVARCHAR(MAX)字段的表。不幸的是,row和page压缩并没有产生预期的影响(对于20 GB的表仅节省了约100/200 MB)。另外,我无法应用列存储和列存储档案压缩,因为它们不支持NVARCHAR(MAX)字段压缩。 有人可以告诉我在这里是否有其他选择吗? 我也猜想row和page压缩没有效果,因为NVARCHAR(MAX)列的内容是唯一的。


2
对于某些特殊字符,ISNUMERIC背后的逻辑是什么?
该ISNUMERIC函数具有某些意外行为。MSDN文档说: ISNUMERIC当输入表达式的计算结果为有效的数值数据类型时,返回1;否则返回0。有效的数字数据类型包括以下类型:int,bigint,smallint,tinyint,十进制,数字,money,smallmoney,float,real。 它也有一个脚注: ISNUMERIC对于非数字字符(例如加号(+),减号(-))和有效的货币符号(例如美元符号($)),返回1。有关货币符号的完整列表,请参见money和s​​mallmoney(Transact-SQL)。 好的,因此+,-和列出的货币符号应被视为数字。到目前为止,一切都很好。 现在是奇怪的部分。首先,链接文章中的某些货币符号不是数字,包括: 欧元货币符号,十六进制20A0: ₠ 奈拉符号,十六进制20A6: ₦ 里亚尔符号,十六进制FDFC: ﷼ 这很奇怪,我似乎找不到原因?此版本或环境相关吗? 但是,事情变得奇怪了。这里有一些我无法解释的内容: /不是数字,而是\(呵呵!) REPLICATE(N'9', 308)是数字,但REPLICATE(N'9', 309)不是 第一个也是最基本的问题是:什么能解释上述情况?但更重要的是:背后的逻辑是什么ISNUMERIC,以便我自己解释/预测所有情况? 这是重现事物的好方法: DECLARE @tbl TABLE(txt NVARCHAR(1000)); INSERT INTO @tbl (txt) VALUES (N''), (N' '), (N'€'), (N'$'), (N'$$'), (NCHAR(8356)), (NCHAR(8352)), (NCHAR(8358)), (NCHAR(65020)), (N'+'), (N'-'), (N'/'), (N'\'), (N'_'), (N'e'), (N'1e'), (N'e1'), (N'1e1'), (N'1'), (N'-1'), …

2
如何选择多个列但只能按一个列分组?
我有一个问题group by,我想选择多列,但仅按一列分组。下面的查询是我尝试的,但是给了我一个错误。 SELECT Rls.RoleName,Pro.[FirstName],Pro.[LastName],Count(UR.[RoleId]) as [Count] from [b.website-sitecore-core].[dbo].[aspnet_UsersInRoles] UR inner join [b.website-professional-au].[dbo].[Profile] Pro on UR.UserId = Pro.Id inner join [b.website-sitecore-core].[dbo].[aspnet_Roles] Rls on Rls.RoleId = UR.RoleId inner join [b.website-professional-au].[dbo].[Gender] Gn on gn.Id = pro.GenderId GROUP BY Rls.RoleName;

1
为什么在SQL Server 2012中使用托管服务帐户而不是虚拟帐户?
在SQL Server 2012中,服务帐户创建为虚拟账户(VAS),如所描述这里,而不是托管服务帐户(MSAS)。 根据说明,我可以看到这些重要的区别: MSA是域帐户,VA是本地帐户 MSA使用AD处理的自动密码管理,VA没有密码 在Kerberos上下文中,MSA自动注册SPN,而VA不注册 还有其他区别吗?如果不使用Kerberos,为什么DBA会更喜欢MSA? 更新:另一个用户已经注意到MS文档中有关VA的可能矛盾: 虚拟帐户是自动管理的,并且虚拟帐户可以在域环境中访问网络。 与 虚拟帐户无法通过身份验证到远程位置。所有虚拟帐户均使用计算机帐户的权限。以格式设置机器帐户 <domain_name>\<computer_name>$。 什么是“机器帐户”?如何/何时/为什么获得“预配”?“在域环境中访问网络”和“在域环境中认证到远程位置”之间有什么区别?

1
在可空的复合索引上重新加入范围搜索?
对于以下架构和示例数据 CREATE TABLE T ( A INT NULL, B INT NOT NULL IDENTITY, C CHAR(8000) NULL, UNIQUE CLUSTERED (A, B) ) INSERT INTO T (A) SELECT NULLIF(( ( ROW_NUMBER() OVER (ORDER BY @@SPID) - 1 ) / 1003 ), 0) FROM master..spt_values 应用程序正在以1,000个行大块的聚集索引顺序处理该表中的行。 从以下查询中检索前1,000行。 SELECT TOP 1000 * FROM T …
14 sql-server  index 

2
从InnoDB表中删除和回收空间
我有一个700GB的InnoDB表,我不会再写入任何数据(只能读取)。我想删除它保存的旧数据并回收该磁盘空间(因为我快用完了)。删除部分非常简单,因为我有一个自动增量主索引,因此我可以使用它对块进行迭代,然后删除行,但这不会让我退缩。我认为OPTIMIZE TABLE会,但是在700GB的桌子上可能会永远占用,所以我有没有忽略其他选择? 由RolandoMySQLDBA编辑 假设您的表是mydb.mytable,请运行以下查询并将其发布在此处,以便您确定表收缩所需的磁盘空间: SELECT FORMAT(dat/POWER(1024,3),2) datsize, FORMAT(ndx/POWER(1024,3),2) ndxsize, FORMAT((dat+ndx)/POWER(1024,3),2) tblsize FROM (SELECT data_length dat,index_length ndx FROM information_schema.tables WHERE table_schema='mydb' AND table_name='mytable') A; 如果允许,我们还需要查看表结构。 由Noam编辑 这是查询的输出: datsize ndxsize tblsize 682.51 47.57 730.08 这是表格结构(SHOW CREATE TABLE) `CREATE TABLE `mybigtable` ( `id` int(11) NOT NULL AUTO_INCREMENT, `uid` int(11) NOT NULL, `created_at` datetime …
14 mysql  innodb 

1
更改nvarchar列的大小时,是否需要删除唯一索引?并且在重新创建索引时表会被锁定吗?
在我们的数据库中,存在一个或多或少如下所示的大表: CREATE TABLE dbo.production_data ( pd_id BIGINT PRIMARY KEY, serial NVARCHAR(16) NOT NULL UNIQUE, ... ); 但是现在串行字段的大小已经变小,因此我想将其更改为32。VisualStudio架构比较工具建议通过以下方式进行操作: DROP INDEX ux_production_data_serial ON dbo.production_data; GO ALTER TABLE dbo.production_data ALTER COLUMN serial NVARCHAR(32) NOT NULL; GO CREATE INDEX ux_production_data_serial ON dbo.production_data(serial ASC); 这真的需要吗?还是更像是一种超级节省的方式? 另外,当重新创建唯一索引时,我的表会被锁定吗?因为这将是一个大问题(因为该表具有3000万行,我想重新创建索引将花费相当长的时间),因为下一个维护窗口将在未来几个月内进行。我有什么选择?

1
sp_procedure_params_90_rowset上的编译阻塞过多
MSDN上该问题的死灰复燃:阻塞的进程报告:这个waitresource是什么“对象:32767:124607697:0 [COMPILE]” 我已经在Profiler中捕获了这些语句。它们的持续时间都超过3秒。超过10岁以上。阻止活动与MSDN的链接相同。 呼叫均使用三部分命名。它们都以不同的形式指定不同的proc,它们看起来如下所示: exec [db1].[sys].sp_procedure_params_90_rowset N'proc1', 1, NULL, NULL exec [db2].[sys].sp_procedure_params_90_rowset N'proc2', 1, NULL, NULL exec [db3].[sys].sp_procedure_params_90_rowset N'proc3', 1, NULL, NULL exec [db4].[sys].sp_procedure_params_90_rowset N'proc4', 1, NULL, NULL 我怎样做才能减少这种阻塞? (编辑)我现在看到以下相同的东西: exec [db1].[sys].sp_primary_keys_rowset N'view1', N'dbo' exec [db2].[sys].sp_primary_keys_rowset N'view1', N'dbo' exec [db3].[sys].sp_primary_keys_rowset N'view1', N'dbo' exec [db4].[sys].sp_primary_keys_rowset N'view1', N'dbo' 这是系统性的事情,但我不知道该怎么办。调用者是通过ADO的VB6。是ADO进行这些调用。 以下是阻止的流程报告示例 <blocked-process-report> <blocked-process> …

1
不应该避免吗?
在某些SQL Server开发人员中,普遍认为这NOT IN非常慢,应该重写查询以使它们返回相同的结果,但不要使用“ evil”关键字。(示例)。 这有什么道理吗? 例如,是否存在SQL Server(哪个版本?)中的一些已知错误,该错误导致使用的查询的NOT IN执行计划比使用 一个LEFT JOIN结合了NULL支票或 (SELECT COUNT(*) ...) = 0在WHERE条款中?

1
'returning'子句可以返回未插入的源列吗?
这是我的现实问题的一个最小示例: create table t(id serial primary key, rnd double precision); 当然,您可以使用returning子句返回插入的列: with w as (insert into t(rnd) values(random()) returning *) insert into t(rnd) select random() from w returning *; /* | ID | RND | |----|----------------| | 9 | 0.203221440315 | */ 您还可以返回文字: with w as (insert into t(rnd) values(random()) …

4
如何确定我的AWS RDS数据库需要多少个IOP?
我正在将mysql数据库的一部分迁移到AWS中。有问题的数据是99%写入的,并且每行都有大约1k的varchar字段,一个日期时间和4个整数。 我估计在高峰时段每小时需要插入20-25k条记录。 我在当前数据库上运行了iostat -h,它报告了大约40 tps。 如何确定我需要哪种类型的IOPS?
14 mysql  amazon-rds 

2
为什么MySQL允许HAVING使用SELECT别名?
据我所知,在SQL中,逻辑查询处理顺序(即概念解释顺序)以以下方式从FROM开始: 从 哪里 通过...分组 拥有 选择 订购 在此列表之后,很容易看出为什么在WHERE子句中没有SELECT别名,因为尚未创建别名。T-SQL(SQL Server)严格遵循此原则,在传递SELECT之前,您不能使用SELECT别名。 但是在MySQL中,即使应该(在逻辑上)在SELECT子句之前对其进行处理,也可以在HAVING子句中使用SELECT别名。这怎么可能? 举个例子: SELECT YEAR(orderdate), COUNT(*) as Amount FROM Sales.Orders GROUP BY YEAR(orderdate) HAVING Amount>1; 该语句在T-SQL中无效(因为HAVING引用了SELECT别名Amount)... Msg 207, Level 16, State 1, Line 5 Invalid column name 'Amount'. ...但是在MySQL中工作正常。 基于此,我想知道: MySQL是否在SQL规则中采取捷径来帮助用户?也许使用某种预分析? 还是MySQL使用的概念解释顺序与我遵循的所有RDBMS遵循的顺序不同?

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.