数据库管理员

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

3
SQL Server:如何仅针对当前会话禁用更新触发?
我正在使用SQL Server 2008 R2。 我有一个表好处,它有一个名为tiu_benefit的AFTER INSERT,UPDATE触发器。 我想为此表编写一个UPDATE语句以更新1行,但我不希望其触发器触发。我知道我可以在UPDATE之前禁用触发器,然后在UPDATE之后启用触发器: DISABLE TRIGGER tiu_benefit ON benefit; GO UPDATE benefit SET editor = 'srh' where benefit_id = 9876 GO ENABLE TRIGGER tiu_benefit ON benefit; GO 但是此禁用和启用触发器将影响当前登录的所有用户。因此,当我的脚本禁用触发器时,另一个用户可能会运行UPDATE / INSERT,这不好。这就是为什么我只想为当前会话禁用和启用触发器。可能吗?如果是,请告诉如何。 谢谢

2
如何找到仍持有锁的查询?
查询sys.dm_tran_locksDMV将向我们显示哪些会话(SPID)持有对表,页面和行等资源的锁定。 对于获得的每个锁,是否有任何方法可以确定哪个SQL语句(删除,插入,更新或选择)导致了该锁? 我知道,most_recent_query_handle在列sys.dm_exec_connectionsDMV给了我们执行的最后一个查询的文本,而是多次其他查询同一个会话(SPID)在跑前和仍持有锁。 我已经使用了该sp_whoisactive过程(来自Adam Machanic),它仅显示了当前在输入缓冲区上的查询(认为DBCC INPUTBUFFER @spid),但并非总是(在我的情况下通常是)获取锁定的查询。 例如: 公开交易/会话 exec一条语句(持有资源锁) 在同一会话上执行另一条语句 打开另一个事务/会话,然后尝试修改在步骤2锁定的资源。 该sp_whoisactive过程将在第3步指出该语句,它不是锁的责任,因此无用。 这个问题来自使用“ 阻塞的流程报告”功能进行分析,以查找生产中阻塞方案的根本原因。每个事务都运行几个查询,大多数情况下,最后一个查询(显示在BPR的输入缓冲区上)很少是持有锁的查询。 我有一个后续问题:有效识别阻塞查询的框架

2
只读文件组中的列存储索引可防止CheckDB
如果文件组包含列存储索引,则似乎设置了文件组以read_only防止dbcc checkdb整个数据库使用。尝试运行checkdb或checkfilegroup(对于数据库中的任何文件组,包括读写辅助文件和[PRIMARY])时,返回以下错误... Msg 8921, Level 16, State 1, Line 24 Check terminated. A failure was detected while collecting facts. Possibly tempdb out of space or a system table is inconsistent. Check previous errors. 是否存在将列存储数据存储在只读文件组中的受支持方法?还是在这种情况下无法进行完整性检查? 复制 create database check_fg_ro go use check_fg_ro go exec sp_changedbowner 'sa'; go alter database check_fg_ro add …

1
与日期比较的子查询效果不佳
当使用子查询查找具有匹配字段的所有先前记录的总数时,在只有5万条记录的表上,性能会很糟糕。没有子查询,查询将在几毫秒内执行。使用子查询,执行时间超过一分钟。 对于此查询,结果必须: 仅包括给定日期范围内的那些记录。 包括所有先前记录的计数,不包括当前记录,无论日期范围如何。 基本表架构 Activity ====================== Id int Identifier Address varchar(25) ActionDate datetime2 Process varchar(50) -- 7 other columns 示例数据 Id Address ActionDate (Time part excluded for simplicity) =========================== 99 000 2017-05-30 98 111 2017-05-30 97 000 2017-05-29 96 000 2017-05-28 95 111 2017-05-19 94 222 2017-05-30 预期成绩 对于日期范围2017-05-29,以2017-05-30 …

6
查询行之间的详细差异以获取大量数据
我有很多大表,每个表都有> 300列。我正在使用的应用程序通过在辅助表中复制当前行来创建已更改行的“归档”。 考虑一个简单的例子: CREATE TABLE dbo.bigtable ( UpdateDate datetime, PK varchar(12) PRIMARY KEY, col1 varchar(100), col2 int, col3 varchar(20), . . . colN datetime ); 存档表: CREATE TABLE dbo.bigtable_archive ( UpdateDate datetime, PK varchar(12) NOT NULL, col1 varchar(100), col2 int, col3 varchar(20), . . . colN datetime ); 在上执行任何更新之前dbo.bigtable,会在中创建该行的副本dbo.bigtable_archive,然后dbo.bigtable.UpdateDate使用当前日期进行更新。 因此,按排序时,UNION将两个表放在一起并按分组可以PK创建更改的时间表UpdateDate。 …

1
为什么子查询中的COALESCE返回NULL?
给定此架构: CREATE TABLE #TEST_COALESCE ( Id int NOT NULL, DateTest datetime NOT NULL, PRIMARY KEY (Id, DateTest) ); INSERT INTO #TEST_COALESCE VALUES (1, '20170201'), (1, '20170202'), (1, '20170203'), (2, '20170204'), (2, '20170205'), (2, '20170206'); 如果我在子查询中使用COALESCE,它将返回NULL。 SELECT t1.Id, t1.DateTest, (SELECT TOP 1 COALESCE(t2.DateTest, t1.DateTest) FROM #TEST_COALESCE t2 WHERE t2.Id = t1.Id …
15 sql-server 


2
加入查询需要11分钟才能在300,000行表上运行
下面的查询需要花费超过11分钟的时间来执行。 SELECT `c`.*, `e`.`name` AS `employee_name`, `e`.`emp_no`, `d`.`code` AS `department_code`, IF(ew.code IS NOT NULL, ew.code, egw.code) AS shift_code, IF(ew.code IS NOT NULL, ew.time_in_from, egw.time_in_from) AS time_in_from, IF(ew.code IS NOT NULL, ew.time_out_to, egw.time_out_to) AS time_out_to, IF(ew.code IS NOT NULL, ew.next_day, egw.next_day) AS next_day FROM `tms_emp_badge_card` AS `c` LEFT JOIN `tms_door_record_raw` AS …

4
PostgreSQL 9.6列删除和带有CTE的SQL函数的副作用
如果我有一个包含3列的表(例如A,B和D),并且我不得不引入一个新表(例如C)来替换D的当前位置。我将使用以下方法: 引入2个新列作为C和D2。 将D的内容复制到D2。 删除D。 将D2重命名为D。 新订单将为A,B,C和D。 我认为这是合法的做法,因为(到目前为止)它没有产生任何问题。 但是,今天,当在同一张表上执行语句的函数返回以下错误时,我遇到了一个问题: table row type and query-specified row type do not match 以及以下详细信息: Query provides a value for a dropped column at ordinal position 13 我尝试重新启动PostgreSQL,执行a VACUUM FULL,最后按照此处和此处的建议删除并重新创建该函数,但是这些解决方案均无效(除了它们尝试解决系统表已更改的情况外)。 由于可以使用非常小的数据库,因此我将其导出,删除并重新导入,从而解决了我的功能问题。 我知道这样一个事实,即不应该通过修改系统表来弄乱列的自然顺序(用弄脏手pg_attribute等),如下所示: 是否可以更改Postgres中列的自然顺序? 从我的函数抛出的错误来看,我现在意识到用我的方法移动列的顺序也是不行的。谁能为我的工作为什么也出错提供一些启发? Postgres版本是9.6.0。 这是函数: CREATE OR REPLACE FUNCTION "public"."__post_users" ("facebookid" text, "useremail" text, "username" …

3
pgAdmin首选项中的二进制路径
我安装了PostgreSQL,因为我需要恢复.backup收到的大文件以上传到另一个平台(该行有3800万行,显然太大了,无法以其他任何方式导出)。当我尝试在pgAdmin 4中“还原”时,出现以下消息: 请在“首选项”对话框中配置PostgreSQL二进制路径。 这只是PostgreSQL文件夹的路径吗?我在PostgreSQL站点上找不到关于此的文档。我能找到的是: 使用“二进制路径”节点中的字段可以指定PostgreSQL二进制实用程序和EnterpriseDB Postgres Advanced Server二进制实用程序的路径。 除了通过pgAdmin之外,还有没有更简单的方法来还原数据库?


2
如何检查非ASCII字符
检查VARCHAR字段是否包含非Ascii字符的最佳方法是什么? CHAR(1)通过CHAR(31)和CHAR(127)通过CHAR(255)。 我尝试使用PATINDEX,并遇到了以下问题。 检查下限范围是否正确。 SELECT * FROM mbrnotes WHERE PATINDEX('%[' + CHAR(1)+ '-' +CHAR(31)+']%',LINE_TEXT) > 0 我的数据有三个记录为0x1E,并且所有三个都返回了。 但是当我只检查上限时: SELECT * FROM mbrnotes WHERE PATINDEX('%[' + CHAR(127)+ '-' +CHAR(255)+']%',LINE_TEXT) > 0 它返回接近表中的所有记录(表计数170737和返回计数170735),并且由于我的数据在此范围内没有任何值,因此我认为它应该不返回任何记录。

2
SQL如何使用子查询删除
我们的开发人员之一添加了以下代码,以从表中删除重复的记录: DELETE SubQuery FROM ( SELECT ID ,FK1 ,FK2 ,CreatedDateTime ,ROW_NUMBER() OVER(PARTITION BY FK1, FK2 ORDER BY CreatedDateTime) AS RowNumber FROM Table ) AS SubQuery WHERE RowNumber > 1 查看代码时,我认为它不起作用,但是在我们的测试环境(SQL 2014)中对其进行测试表明它可以! SQL如何知道如何解析子查询并从中删除记录table?

1
缺少多个索引的执行计划
如果使用“包含实际执行计划”运行查询,则该计划还将建议缺少的索引。索引详细信息MissingIndexes位于XML的内部标记中。计划中包含多个索引建议时会出现这种情况吗?我尝试了不同的sql查询,但是无法提供任何生成两个或多个缺失索引的查询。

2
可以对SQL Server系统表进行碎片整理吗?
我们有几个数据库,在其中创建和删除了大量表。据我们所知,SQL Server不会对系统基表进行任何内部维护,这意味着它们随着时间的流逝会变得非常零散,并且大小会膨胀。这给缓冲池造成了不必要的压力,并且还负面影响了操作的性能,例如计算数据库中所有表的大小。 有没有人建议尽量减少这些核心内部表上的碎片?一个显而易见的解决方案可以避免创建太多表(或在tempdb中创建所有临时表),但是出于这个问题的目的,我们可以说应用程序没有这种灵活性。 编辑:进一步的研究显示了这个悬而未决的问题,该问题看起来密切相关,并且表明可以选择某种形式的手动维护ALTER INDEX...REORGANIZE。 初步研究 有关这些表的元数据可以在以下位置查看sys.dm_db_partition_stats: -- The system base table that contains one row for every column in the system SELECT row_count, (reserved_page_count * 8 * 1024.0) / row_count AS bytes_per_row, reserved_page_count/128. AS space_mb FROM sys.dm_db_partition_stats WHERE object_id = OBJECT_ID('sys.syscolpars') AND index_id = 1 -- row_count: 15,600,859 -- …

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.