数据库管理员

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

3
如果有许多用户,则DROP USER将花费太长时间
在具有足够RAM和快速磁盘的SQL Server 2014实例上,有160多个用户可以访问数据库。由于某些我不知道的原因,DROP USER [username]在此数据库中运行该命令每个用户最多需要5秒钟。 重新映射用户以登录并恢复其权限非常快。 在从生产中刷新DEV数据库的上下文中,我必须删除并重新创建所有数据库用户。因此,必须删除数据库用户并重新创建它们。 如何加快DROP USER命令速度? 请记住,对于我正在写的实例,我必须运行160次以上。 这是我正在使用的SQL: DECLARE drop_user_cur CURSOR FOR SELECT name FROM #drop_users OPEN drop_user_cur FETCH NEXT FROM drop_user_cur INTO @user WHILE @@FETCH_STATUS = 0 BEGIN SET @sql = 'use [' + @db_name + '] DROP USER [' + @user + ']' BEGIN TRY …

1
文件组的好处以及将文件组设置为只读
在将多个文件组更改为只读是一个不错的选择以及何时使用它们的情况下,有人可以引用我的真实场景吗?如果将其设置为只读,会有什么好处? 在具有多个文件组的数据库上,您是否需要对整个数据库进行备份,还必须备份该文件组中的每个文件?您还能给我一个何时使用文件组备份的示例吗?我不明白为什么只备份整个数据库对备份文件组会有好处。希望我能获得现实的经验,此文件组备份将是理想的选择

1
使用CEILING时,CASE表达式返回错误的值
我遇到了一个问题,就是CASE表达式无法返回我期望的结果。 作为测试,我添加了一个十进制变量并对它运行相同的CASE表达式,它运行良好,返回的结果与我期望的一样(将值四舍五入IsGun=1。但是当我CASE对另一个十进制值运行相同的表达式时,它总是返回CEILING()函数的值,并且永远不会返回原始值。 这是SQL代码: DECLARE @Num decimal(8,2); set @Num = 12.54; WITH PQ AS ( SELECT UPC, Price1, DBID, AVG(Price1) OVER (PARTITION BY UPC) AS Price1Avg FROM vProducts_PriceQty_Union ) SELECT PQ.UPC, PQ.Price1, PQ.Price1Avg, (CASE WHEN p.IsGun = 1 THEN CEILING(@Num) ELSE @Num END) AS UsingVar, CAST( (CASE WHEN P.IsGun = 1 …

3
MDX与SQL进行分析查询的好例子
在进行分析查询时,有人可以向我展示MDX与常规SQL相比的优势的好例子吗?我想将MDX查询与提供相似结果的SQL查询进行比较。 维基百科说: 尽管可以将其中一些转换为传统SQL,但即使对于非常简单的MDX表达式,也经常需要笨拙的SQL表达式的合成。 但是既没有引用也没有例子。我完全知道,基础数据必须以不同的方式组织,并且OLAP每次插入都需要更多的处理和存储。(我的建议是从Oracle RDBMS迁移到Apache Kylin + Hadoop) 上下文:我试图说服我的公司我们应该查询OLAP数据库而不是OLTP数据库。大多数SIEM查询都大量使用“分组依据”,“排序”和“聚合”。除了提高性能外,我认为OLAP(MDX)查询比等效的OLTP SQL更简洁,更易于读取/写入。一个具体的例子可以帮助我们理解这一点,但是我不是SQL方面的专家,更不用说MDX了。 如果有帮助,这里有一个与SIEM相关的SQL查询示例,用于查询上周发生的防火墙事件: SELECT 'Seoul Average' AS term, Substr(To_char(idate, 'HH24:MI'), 0, 4) || '0' AS event_time , Round(Avg(tot_accept)) AS cnt FROM ( SELECT * FROM st_event_100_#yyyymm-1m# WHERE idate BETWEEN trunc(sysdate, 'iw')-7 AND trunc(sysdate, 'iw')-3 #stat_monitor_group_query# UNION ALL SELECT * FROM st_event_100_#yyyymm# WHERE …
11 olap  mdx 

4
格式为:YYYYNNNNNN的“ Id”,其中NNNNNN部分每年重新开始
我有一个业务需求,即发票表中的每个记录都有一个看起来像YYYYNNNNNN的ID。 NNNNNN部分需要在每年年初重新启动。因此,2016年输入的第一行看起来像2016000001,第二行看起来像2016000002等。假设2016年的最后一条记录是2016123456,下一行(2017年)应该看起来像2017000001 我不需要此ID作为主键,并且我也存储创建日期。这个想法是,这个“显示ID”是唯一的(因此我可以通过它查询),并且可以按年份分组。 任何记录都不太可能被删除;但是,我倾向于针对此类内容进行防御性编码。 有什么方法可以创建此ID,而不必在每次插入新行时都查询今年的最大ID? 想法: A CreateNewInvoiceSP,获得当年的MAX值(讨厌) 一些神奇的内置功能可以做到这一点(我可以梦到了) 能够在IDENTITYor DEFAULT声明(??)中指定一些UDF或其他内容 使用的视图PARTITION OVER + ROW()(被删除将是有问题的) 触发INSERT(仍然需要运行一些MAX查询:() 一年一次的后台工作,用每年插入的MAX来更新一张表格,然后我...有事吗? 所有这些都不理想。任何想法或变化都欢迎!
11 sql-server  t-sql 


3
具有高选择性和低选择性字段的复合索引顺序中的字段顺序
我有一个超过30亿行的SQL Server表。我的查询之一花费了很长时间,因此我正在考虑对其进行优化。查询如下所示: SELECT [Enroll_Date] ,Count(*) AS [Record #] ,Count(Distinct UserID) AS [User #] FROM UserTable GROUP BY [Enroll_Date] [Enroll_Date]是一个低选择性列,可能值少于50个,而UserID列是高选择性列,其中有2亿多个不同的值。根据我的研究,我相信我应该在这两列上创建非聚集复合索引,并且从理论上讲,高选择性列应该是第一列。但是我不确定我的工作是否可行,因为我在group by子句中使用了低选择性列。 该表没有聚簇索引。

5
将日期范围转换为间隔描述
最近的项目中的一项要求是报告何时将完全消耗资源。除了用尽日历日期外,还要求我用英语形式显示剩余时间,例如“要走1年3个月”。 内置DATEDIFF功能 返回在指定开始日期和结束日期之间跨越的指定日期部分边界的计数...。 如果按原样使用,可能会产生误导性或令人困惑的结果。例如,使用YEAR间隔将显示1999-12-31(YYYY-MM-DD)和2000-01-01相隔一年,而常识会说这些日期仅相隔1天。相反,使用1999年12月31日和2010年12月31日之间的时间间隔为4018天,而大多数人会以“ 11年”作为更好的描述。 从天数开始,然后从中计算月份和年份,将容易出现and年和月份大小错误。 我想知道如何在各种SQL方言中实现它?输出示例包括: create table TestData( FromDate date not null, ToDate date not null, ExpectedResult varchar(100) not null); -- exact formatting is unimportant insert TestData (FromDate, ToDate, ExpectedResult) values ('1999-12-31', '1999-12-31', '0 days'), ('1999-12-31', '2000-01-01', '1 day'), ('2000-01-01', '2000-02-01', '1 month'), ('2000-02-01', '2000-03-01', '1 month'), -- …

1
除非使用OPTION(RECOMPILE),否则不使用索引SEEK。
(问题移至SO) 我有一个表(虚拟数据),其中聚集索引包含2列: 现在,我运行这两个查询: declare @productid int =1 , @priceid int = 1 SELECT productid, t.priceID FROM Transactions AS t WHERE (productID = @productid OR @productid IS NULL) AND (priceid = @priceid OR @priceid IS NULL) SELECT productid, t.priceID FROM Transactions AS t WHERE (productID = @productid) AND (priceid = @priceid) …

5
反转可返回UNKNOWN的布尔表达式
例 我有桌子 ID myField ------------ 1 someValue 2 NULL 3 someOtherValue 以及一个T-SQL布尔表达式,其值可以为TRUE,FALSE或(由于SQL的三元逻辑)UNKNOWN: SELECT * FROM myTable WHERE myField = 'someValue' -- yields record 1 如果我想获取所有其他记录,则不能简单地取反表达式 SELECT * FROM myTable WHERE NOT (myField = 'someValue') -- yields only record 3 我知道为什么会这样(三元逻辑),并且我知道如何解决这个特定问题。 我知道我可以使用,myField = 'someValue' AND NOT myField IS NULL并且得到一个“可逆”表达式,它永远不会产生未知: SELECT * …

1
为什么我的索引查找可以估计正确的行数而排序运算符不能呢?
我有一个查询,该查询在谓词上使用函数,如下所示: commentType = 'EL' AND commentDateTime >= DATEADD(month,datediff(month,0,getdate()) - 13,0) 我在commentType上有一个经过筛选的索引,该索引具有40K行,当我运行查询时,Index Seek的估计行数非常准确(大约11K),但是对于下一步(sort运算符),它完全忽略了统计信息,仅估算过滤索引中的总行数。 为什么会这样呢?我知道有关可保留性的基础知识,并且为了安全起见,我已经进行了测试,以实际日期(2014-01-01)替换dateadd和voila ...排序开始正确地猜测行数... 为什么会发生这种情况,我该如何解决?我无法通过固定日期...

1
如何导出sp_AskBrent的输出?
我们有一个随机增加CPU峰值的实例。我想创建一个警报,该警报在CPU上触发超过90%的警报,并自动调用运行的作业sp_AskBrent并通过电子邮件将输出发送给我。但是,该输出在“文本”或HTML输出中均不可读。它甚至不能很好地放入Excel电子表格中。如何获取可读格式的信息?


2
有理由使用SELECT…WITH XLOCK?
我面临着一些反复出现的死锁,其中之一是键锁,并且包含带有XLOCK提示的SELECT查询,该查询成为了死锁的受害者。另一个语句是对其中一个表的INSERT,该表是第一个查询的视图的一部分。 视图: create view dbo.viewE as select * from dbo.E where myValue > 13000 选择查询: select * from dbo.viewE with (XLOCK) where A > GETUTCDATE() INSERT语句: INSERT INTO [dbo].[E] (myValue,A) VALUES (10,GetDate()) 基础表dbo.E在大约20列中拥有约300万行,其中有些是ntext。 取出查询并使用两个事务手动进行模拟,该行为是可重现的。如果从选择中删除了XLOCK,则行为会更改。 死锁图: <deadlock-list> <deadlock victim="process222222221"> <process-list> <process id="process222222221" taskpriority="0" logused="0" waitresource="KEY: 5:72057604035644444 (ccdf51accc0c)" waittime="2522" ownerId="27202256401" transactionname="SELECT" lasttranstarted="2015-09-14T16:32:36.160" …

1
将旧数据设为只读
在我当前正在从事的数据库项目中,要求在某个时间点将“旧”数据更改为只读。在SQL Server中可以吗? 我不能更改表许可权,因为只读许可权应仅适用于早于特定阈值的数据,即用户仍应能够添加和编辑在此时间点之后添加的数据。
11 sql-server 

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.