数据库管理员

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

1
SQL Server表名以用户数据库中的#开头,而不是tempdb(不是临时表)
几十年前,以某种方式在我们的数据库中创建了一个以#。开头的表。它显示在应用程序数据库下的对象资源管理器中,而不是中tempdb。由于某些原因,Azure不会像这样导入数据库。 我们无法删除它,对其重命名或与之交互。我试过从对象资源管理器中删除,从GUI中删除脚本,重命名,但它们都没有起作用。 我们正在使用SQL 2008 R2。 drop table [*app*].[dbo]."#OBSOLETE"; Database name '*app*' ignored, referencing object in tempdb. Msg 3701, Level 11, State 5, Line 1 Cannot drop the table '#OBSOLETE', because it does not exist or you do not have permission. exec sp_rename "dbo.#OBSOLETE", "dbo.obsolete" Msg 15225, Level 11, State 1, …

4
此WHERE子句中的%有何作用?
我正在训练中,其中一个脚本具有以下命令: SELECT SUM(Col2) FROM clust_table WHERE Col1 % 3 = 1 我想知道此代码段在WHERE子句中的作用: Col1 % 3 = 1 我在互联网上进行了一些研究,但没有找到有关此命令的参考。
13 sql-server  t-sql 

2
DBCC FREEPROCCACHE或DBCC FREESYSTEMCACHE('SQL Plans')都不执行任何操作来释放CACHESTORE_SQLCP内存
CACHESTORE_SQLCP几天后,SQL计划占用超过38 GB的内存。 我们已经在运行“优化临时工作负载”选项。(实体框架和自定义报告会产生很多特殊条件!) 具有多可用区镜像的AWS RDS上的SQL Server 2016 SE 3.00.2164.0.v1 当我跑步时: DBCC FREESYSTEMCACHE('SQL Plans'); 要么 DBCC FREEPROCCACHE 要么 DBCC FREESYSTEMCACHE ('SQL Plans') WITH MARK_IN_USE_FOR_REMOVAL 要么 DBCC FREESYSTEMCACHE ('ALL') WITH MARK_IN_USE_FOR_REMOVAL; 它似乎无法清除: SELECT TOP 1 type, name, pages_kb FROM sys.dm_os_memory_clerks ORDER BY pages_kb desc type name pages_kb CACHESTORE_SQLCP SQL Plans 38321048 我在启用查询存储的情况下运行,但是我禁用了它以查看是否有任何干扰,这似乎没有帮助,但我将其保留了下来。 …

1
差异备份问题-为什么?这可能吗?
我正在使用SQL Server 2014,情况是这样的: 我有服务器A和服务器B。 隔夜ETL在服务器A上处理。 加载过程完成后,将备份数据库X(使用CHECKSUM和RESTORE VERIFYONLY确保可靠性),然后将其发送到服务器B。 服务器B接收到该bak文件,然后在那里还原数据库。 我想使用差异备份策略,以便: 完全备份仅在星期六执行, 即在星期六在服务器A上进行完全备份->运送到服务器B->恢复服务器B上的完全备份 剩下的日子将是差异备份, 即服务器A上的差异备份->运送到服务器B->恢复服务器B上的差异备份 我已经尝试过,但出现错误,说: 日志或差异备份无法还原,因为没有文件准备好前滚。 不知道为什么。我检查sys.database_files了服务器A和服务器B,可以看到differential_Base_LSN和differential_base_GUID相同。还有其他地方要检查吗? 顺便说一句,在上面的步骤2中,当我在服务器B上还原差异备份时,是否总是需要每次都还原完全备份+差异备份? 我只还原了差异备份WITH RECOVERY(并收到该错误消息),因为完整备份已于前一天还原。 需要说明的是:是的,我希望服务器B上的数据库在差异之间可读。我该如何解决?是我每晚唯一的RESTORE FULL (WITH NORECOVERY)+ RESTORE DIFF (WITH RECOVERY)组合顺序选项吗? 任何指导将不胜感激。

1
在运行查询时如何模拟低内存状态
我试图更好地了解SQL Server的执行引擎在低内存状态下的行为。说到内存授予,我想知道是否有某种方法可以强制GrantedMemory等于RequiredMemory。(我的猜测是有一个未记录的跟踪标志可以做到这一点。有人知道它是什么吗?)


3
每小时自动在MS SQL Studio中执行查询
我支持大型企业中的应用程序,我的职责之一是清理数据。我需要每小时执行一次查询,我想使其自动化。由于组织政策的原因,我无法创建SQL Server代理作业或修改架构,只能操作数据。 一望无际 WHILE(1=1) BEGIN WAITFOR DELAY '01:00'; --do work END 为我完成了工作,但是我对永久开放的连接感到耸耸肩。 理想情况下,我会编写脚本来编写MS SS本身,以每小时执行一次给定的代码,但是我不确定是否可行。 这个问题有解决方案吗?

3
克服LIKE字符长度限制
通过阅读这里的LIKE字符长度限制,看起来我在LIKE子句中发送的文本长度不能超过4000个字符。 我正在尝试从特定查询的查询计划缓存中获取查询计划。 SELECT * FROM sys.dm_exec_cached_plans AS cp CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st where st.text like '%MY_QUERY_LONGER_THAN_4000_CHARS%' ESCAPE '?' 如果其中的查询LIKE超过4000个字符,那么即使我的查询在缓存计划中,我也会得到0个结果。(我期待至少是错误)。 有没有办法解决此问题或采取其他措施?我的查询长度可能超过了>个10000字符,看起来好像无法使用来查找它们LIKE。

2
为什么丢弃外键要花很长时间?
我制作了一个脚本,可以一次删除一个数据库中的所有外键,就像这样: ALTER TABLE MyTable1 DROP CONSTRAINT FK_MyTable1_col1 ALTER TABLE MyTable2 DROP CONSTRAINT FK_MyTable2_col1 ALTER TABLE MyTable2 DROP CONSTRAINT FK_MyTable2_col2 令我惊讶的是,该脚本花费的时间很长:每个DROP FK平均需要20秒。现在,我知道创建FK可能是一件大事,因为服务器必须去检查FK约束是否从一开始就没有受到侵犯,而是放弃了?服务器删除需要很长时间的FK时会做什么?这既出于我自己的好奇心,又是为了了解是否有一种使事情更快的方法。能够删除FK(而不仅仅是禁用它们)可以使我在迁移过程中更快,从而最大程度地减少停机时间。

1
Perfmon计数器“次优计划/秒”实际测量什么?
在SQL Server中,Perfmon计数器“工作负载组状态:次优计划/秒”的测量结果是什么? 它是Resource Governor计数器之一,因此按工作负载组(是否配置RG来衡量)进行测量。 我不是在问什么是好的计划或坏的计划,而是该采取什么对策,以及在哪里可以找到确切的相应计划?例如,我在扩展事件中找不到与触发“次优计划/秒”计数器的查询相匹配的任何内容。
13 sql-server 

2
SQL Server 2016中用于空间数据的MakeValid()的替代方法
我有一张非常大的地理LINESTRING数据表,我正在从Oracle迁移到SQL Server。在Oracle中有许多针对此数据执行的评估,并且也需要针对SQL Server中的数据执行评估。 问题是:SQL Server对有效的要求LINESTRING比对Oracle的要求严格;“ LineString实例不能在两个或多个连续点的间隔内重叠”。 碰巧的是,我们LINESTRING的某个百分比不符合该标准,这意味着我们需要评估数据的功能会失败。我需要调整数据,以便可以在SQL Server中成功对其进行验证。 例如: 验证一个非常简单的方法LINESTRING,使其自身加倍: select geography::STGeomFromText( 'LINESTRING (0 0 1, 0 1 2, 0 -1 3)',4326).IsValidDetailed() 24413: Not valid because of two overlapping edges in curve (1). MakeValid针对它执行功能: select geography::STGeomFromText( 'LINESTRING (0 0 1, 0 1 2, 0 -1 3)',4326).MakeValid().STAsText() LINESTRING (0 -0.999999999999867, 0 …

4
如何将前1亿个正整数转换为字符串?
这与实际问题有些牵连。如果提供上下文帮助,则生成此数据可能对处理字符串的性能测试方式,生成需要在游标中对其应用某些操作的字符串或生成敏感数据的唯一匿名名称替换有用。我只是对在SQL Server中生成数据的有效方式感兴趣,请不要问为什么我需要生成此数据。 我将尝试从一个正式的定义开始。如果字符串仅由A-Z的大写字母组成,则包含在该系列中。该系列的第一项是“ A”。该系列由所有有效字符串组成,这些字符串按长度优先,然后按典型字母顺序排列。如果字符串在名为的列的表中STRING_COL,则该顺序可以在T-SQL中定义为ORDER BY LEN(STRING_COL) ASC, STRING_COL ASC。 为了给出一个不太正式的定义,请查看excel中按字母顺序排列的列标题。该系列是相同的模式。考虑如何将整数转换为以26为底的数字: 1-> A,2-> B,3-> C,...,25-> Y,26-> Z,27-> AA,28-> AB,... 这个类比不是很完美,因为“ A”的行为不同于以10为底的0。下表列出了一些选定的值,希望可以使其更加清楚: ╔════════════╦════════╗ ║ ROW_NUMBER ║ STRING ║ ╠════════════╬════════╣ ║ 1 ║ A ║ ║ 2 ║ B ║ ║ 25 ║ Y ║ ║ 26 ║ Z ║ ║ 27 ║ …

1
如何防止UNPIVOT转换为UNION ALL?
我有一个稍微复杂的Oracle查询,大约需要半个小时才能完成。如果我执行查询的慢速部分并单独运行它,它将在几秒钟内完成。这是隔离查询的SQL Monitor报告的屏幕截图: 作为完整查询的一部分运行时,这是相同的逻辑: 颜色与两个屏幕截图中的相同表格相对应。对于慢速查询,Oracle MERGE JOIN在的两个表中没有相等条件的表之间执行JOIN。结果,不必要地处理了大约1.5亿个中间行。 我可以通过查询提示或重写来解决此问题,但我想尽可能多地了解根本原因,以便将来避免该问题并可能向Oracle提交错误报告。每次我得到错误的计划UNPIVOT时,查询文本中的内容都会转换为UNION ALL计划中的一个。为了进一步调查,我想阻止查询转换的发生。我无法找到此转换的名称。我也无法找到阻止它的查询提示或下划线参数。我正在开发服务器上进行测试,因此一切正常。 有什么我可以做,以防止的查询转换UNPIVOT到UNION ALL?我使用的是Oracle 12.1.0.2。 由于IP原因,我无法共享查询,表名或数据。我无法提出一个简单的复制品。话虽如此,我仍不清楚为什么需要这些信息来回答这个问题。这是UNPIVOT查询以及与UNION ALL相同的查询的示例。

6
为什么不能在联接中使用空值?
我已经通过使用...解决了查询问题,row_number() over (partition by这是一个更笼统的问题,为什么我们不能在联接中使用具有空值的列。为什么不能为了联接而将null等于null?
13 oracle  join  null 

7
分组或窗口
我有一种情况,我认为可以使用窗口函数解决,但我不确定。 想象一下下表 CREATE TABLE tmp ( date timestamp, id_type integer ) ; INSERT INTO tmp ( date, id_type ) VALUES ( '2017-01-10 07:19:21.0', 3 ), ( '2017-01-10 07:19:22.0', 3 ), ( '2017-01-10 07:19:23.1', 3 ), ( '2017-01-10 07:19:24.1', 3 ), ( '2017-01-10 07:19:25.0', 3 ), ( '2017-01-10 07:19:26.0', 5 ), …

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.