数据库管理员

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

7
储存IP位址
我必须将所有注册用户的IP地址存储在数据库中。我想知道,我应该为该列声明多少个字符? 我也应该支持IPv6吗?如果是,那么IP地址的最大长度是多少?


2
SQL Server-授予对整个架构与对象的权限?
对于SQL Sever中的数据库权限管理,我感到非常高兴。 让我们保持一个简单的例子。 假设帐户“ admin”是架构A,B和C的所有者。 您想要在架构A,B和C下创建的任何对象(表/视图)具有完全权限(更新/删除/插入/选择/更改)的另一个帐户“ minion”。 这可能吗?还是您每次在这些模式下添加表/视图时都必须执行Grant语句?(对我来说似乎有点愚蠢)。

2
如何使用单个查询插入或更新?
我有一个表测试,该表具有列ID,主键和自动递增的名称。我只想在没有记录的情况下插入新记录。 输入的ID为30122,名称为john 如果有ID为30122的记录,那么我将name列更新为john,如果没有记录,则我插入了一条新记录。 我可以使用2个查询 select * from test where id=30122 如果它有一些记录,那么我可以使用 update test set name='john' where id=3012 或者如果它没有记录,那么我可以使用 insert into test(name) values('john') 但是我想使用单个查询? 有人可以告诉它是否可能吗?


5
在MySQL查询中使用反引号(`)的好处?
在MySQL中,我们可以创建带有或不带有反引号(`)符号的查询。例: SELECT * FROM TEST; SELECT * FROM `TEST`; 两者都可以在mysql-console中正常工作。 它们之间有技术上的区别吗? `相对于简单查询,使用()有什么好处?
25 mysql  select 

5
有什么方法可以在数据仓库中实现多对多关系?
数据仓库建模的主要拓扑(星型,雪花型)在设计时考虑了一对多关系。当面对这些建模方案中的多对多关系时,查询的可读性,性能和结构会严重下降。 有什么方法可以实现维度之间或事实表与数据仓库中的维度之间的多对多关系,它们在必要的粒度和查询性能方面会造成什么折衷?

1
(NOLOCK)与NOLOCK
当我看到类似以下查询的查询时,我正在调查一些阻塞: SELECT SomeField FROM SomeTable NOLOCK 我看到了,NOLOCK并且很好奇它如何阻止其他查询(在本例中为DELETE语句)。我快速浏览了使用的锁sp_lock,这是我看到的内容: DB S GRANT TAB IS GRANT PAG S GRANT 现在,我的理解是NOLOCK应该只获取一个Schema-Stability锁,为什么它随后会获取IS锁? 我的好奇心激起了。我查看了BOL,发现有两种使用方法,WITH (NOLOCK)并且已经过时了(NOLOCK),所以我决定尝试一下。我运行以下查询,随后运行sp_lock: SELECT SomeField FROM SomeTable WITH (NOLOCK) DB S授权 TAB Sch-S GRANT SELECT SomeField FROM SomeTable (NOLOCK) DB S授权 TAB Sch-S GRANT 果然,这里有我的架构稳定性锁。所以我的问题是:这是怎么回事?如果使用NOLOCK的可接受语法是WITH (NOLOCK)或(NOLOCK),那么为什么仅使用普通NOLOCK字符(不带括号)运行查询时却不会出现查询错误?如果支持,为什么要抓住IS锁?我在这里想念什么?我一直在网上寻找答案,但到目前为止还很短。 我已经在2008R2和2012上对此进行了测试。

1
添加选择时超出自引用标量函数嵌套级别
目的 尝试创建自引用功能的测试示例时,一个版本失败,而另一个版本成功。 唯一的区别是添加SELECT到功能主体上,导致两者的执行计划不同。 起作用的功能 CREATE FUNCTION dbo.test5(@i int) RETURNS INT AS BEGIN RETURN( SELECT TOP 1 CASE WHEN @i = 1 THEN 1 WHEN @i = 2 THEN 2 WHEN @i = 3 THEN dbo.test5(1) + dbo.test5(2) END ) END; 调用函数 SELECT dbo.test5(3); 退货 (No column name) 3 该功能不起作用 CREATE …

3
SQL Server定期清除计划缓存和执行状态
将SQL Server 2014升级到2016后,服务器每隔几个小时会不断重置缓存的执行计划和dm*视图(如dm_exec_query_stats)等。 就像有人执行DBCC FREEPROCCACHE并DBCC DROPCLEANBUFFERS手动执行一样(除了没有人执行之外,它会自动发生)。 相同的数据库在SQL Server 2014和Windows Server 2012上都可以正常工作,在迁移到SQL Server 2016(和Windows Server 2016)之后一切都变了。 事情我检查:数据库并没有具备“自动关闭”标志。SQL Server ad hoc optimized设置为true(我认为这会有所帮助,但没有帮助)。“查询存储”为“关闭”。服务器有16 GB内存。 “ SQL Server日志”中也没有任何帮助。只是每周的备份消息... 我还检查了这篇文章https://docs.microsoft.com/zh-cn/sql/t-sql/statements/alter-database-transact-sql-set-options(向下滚动到“示例”部分,并在上面它)有自动清除计划的情况清单。这些都不适用。 更新: 不幸的是,这些建议都没有帮助。授予LPIM权限,检测并修复为同一查询生成大量计划的非参数化查询,从而降低“最大服务器内存” ...计划保持随机重置,从每隔几个小时到每5-10分钟一次。如果服务器“内存不足”,那么2014版在同一台机器上运行正常。 这是请求的sp_Blitz输出 **Priority 10: Performance**: - Query Store Disabled - The new SQL Server 2016 Query Store feature has not been enabled on …

2
LIKE运算符的基数估计(局部变量)
我给人的印象是,LIKE在对未知场景进行所有优化时都使用运算符时,旧的和​​新的CE都使用9%的估计值(假设相关统计数据可用并且查询优化器不必求助于选择性猜测)。 当对信用数据库执行以下查询时,在不同的CE下我得到了不同的估计。在新的CE下,我收到了900行的估计值,而在旧的CE下,我收到了241.416的估计值,我不知道如何得出此估计值。有人能说清楚吗? -- New CE (Estimate = 900) DECLARE @LastName VARCHAR(15) = 'BA%' SELECT * FROM [Credit].[dbo].[member] WHERE [lastname] LIKE @LastName; -- Forcing Legacy CE (Estimate = 241.416) DECLARE @LastName VARCHAR(15) = 'BA%' SELECT * FROM [Credit].[dbo].[member] WHERE [lastname] LIKE @LastName OPTION ( QUERYTRACEON 9481, QUERYTRACEON 9292, QUERYTRACEON 9204, QUERYTRACEON …

2
最大用户连接数
在SQL Server 2012 Standard Edition中,我知道用户连接的最大数量为32,767。如果我朝着这个数字前进,我应该怎么做? 当前有30,000个用户连接,并且这个数字有望增加。

3
在数据库中强制执行“至少一个”或“完全一个”的约束
假设我们有用户,每个用户可以有多个电子邮件地址 CREATE TABLE emails ( user_id integer, email_address text, is_active boolean ) 一些样本行 user_id | email_address | is_active 1 | foo@bar.com | t 1 | baz@bar.com | f 1 | bar@foo.com | f 2 | ccc@ddd.com | t 我要强制执行一个约束,即每个用户都只有一个活动地址。如何在Postgres中做到这一点?我可以这样做: CREATE UNIQUE INDEX "user_email" ON emails(user_id) WHERE is_active=true; 这样做可以防止用户拥有多个活动地址,但我相信不能防止其所有地址都设置为false。 如果可能的话,我宁愿避免使用触发器或pl / …

6
我可以依靠顺序读取SQL Server身份值吗?
TL; DR:下面的问题归结为:插入行时,在生成新Identity值和锁定聚集索引中的相应行键之间是否存在机会之窗,外部观察者可以看到更新的值 Identity并发交易插入的价值?(在SQL Server中。) 详细版本 我有一个带有Identity名为的列的SQL Server表CheckpointSequence,这是表的聚集索引(也具有许多其他非聚集索引)的键。通过多个并发进程和线程将行插入表中(处于隔离级别READ COMMITTED,并且没有IDENTITY_INSERT)。同时,有些进程会定期从聚簇索引中读取行,并按该CheckpointSequence列排序(也处于隔离级别READ COMMITTED,并且该READ COMMITTED SNAPSHOT选项处于关闭状态)。 我目前依靠这样的事实,即读取过程永远不会“跳过”检查点。我的问题是:我可以依靠这个财产吗?如果没有,我该怎么做才能实现? 示例:当插入具有标识值1、2、3、4和5 的行时,阅读器在看到具有值4的行之前必须看不到具有值5的行。测试表明该查询包含一个ORDER BY CheckpointSequence子句(和一个WHERE CheckpointSequence > -1子句),只要要读取第4行但尚未提交,就可靠地阻塞,即使第5行已经提交。 我认为至少从理论上讲,这里可能存在一种竞争条件,可能会导致这一假设被打破。不幸的是,关于多个并发事务的工作方式的文档Identity并没有太多说明Identity,而只是说“每个新值都是基于当前的种子和增量生成的”。和“特定交易的每个新值都与表上的其他并发交易不同”。(MSDN) 我的推理是,它必须以这种方式工作: 事务开始(显式或隐式)。 生成标识值(X)。 根据身份值在聚集索引上获取相应的行锁(除非发生锁升级,在这种情况下整个表都被锁定)。 该行已插入。 事务已提交(可能要花很多时间),因此将再次删除该锁。 我认为在第2步和第3步之间,有一个很小的窗口, 并发会话可以生成下一个标识值(X + 1)并执行所有其余步骤, 因此,允许阅读者恰好在该时间点阅读值X + 1,而忽略了X的值。 当然,这种可能性似乎很小。但仍然-可能会发生。可以吗 (如果您对上下文感兴趣:这是NEventStore的SQL Persistence Engine的实现。NEventStore实现一个仅附加事件存储,其中每个事件都获得一个新的,升序的检查点序列号。客户端从按检查点排序的事件存储中读取事件为了执行各种计算,一旦处理了带有检查点X的事件,客户就只考虑“较新的”事件,即带有检查点X + 1及更高版本的事件,因此,至关重要的是永远不能跳过事件,因为它们再也不会被考虑了,我目前正在尝试确定Identity基于-checkpoint的实现是否满足此要求。这些是所使用的确切SQL语句:Schema,Writer的query,读者查询。) 如果我是对的,并且可能出现上述情况,那么我只能看到两种处理方式,但都不令人满意: 在看到X之前看到检查点序列值X + 1时,关闭X + 1并稍后再试。但是,由于Identity当然会产生间隙(例如,当事务回滚时),因此X可能永远不会出现。 因此,相同的方法,但是在n毫秒后接受间隔。但是,我应该假定n的值是多少? 还有更好的主意吗?

9
使用T-SQL测试字符串是否是回文
我是T-SQL的初学者。我想确定输入字符串是否是回文,如果不是,则输出= 0,如果是,则输出= 1。我仍然在弄清楚语法。我什至没有收到错误消息。我正在寻找不同的解决方案和一些反馈,以更好地理解和了解T-SQL的工作原理,并且变得更好-我仍然是一名学生。 正如我所看到的,关键思想是将最左边和最右边的字符相互比较,检查是否相等,然后将左边的第二个字符与最后一个的第二个字符进行比较,依此类推。我们做一个循环:如果字符彼此相等,我们继续。如果到达末尾,则输出1;否则,输出0。 您能否批评一下: CREATE function Palindrome( @String Char , @StringLength Int , @n Int , @Palindrome BIN , @StringLeftLength Int ) RETURNS Binary AS BEGIN SET @ n=1 SET @StringLength= Len(String) WHILE @StringLength - @n >1 IF Left(String,@n)=Right(String, @StringLength) SET @n =n+1 SET @StringLength =StringLength -1 RETURN @Binary …

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.