数据库管理员

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

1
SHRINKFILE失败-为什么增加文件大小可以解决?
我正在运行一些SHRINKFILE操作来清理文件组中的一堆微小的不必要文件。对于其中一种收缩,以下命令将导致错误: DBCC SHRINKFILE (N'myfile' , EMPTYFILE)' 无法缩小数据库ID x的文件ID x,因为它正在被另一个进程缩小或为空 它不是空的也不是收缩的。它正在除我以外的任何人当前未使用的数据库上运行。自动收缩功能未启用,也从未启用过。但是,如果真的很重要,在我开始使用该数据库之前,会定期对其进行手动收缩。 在SQLServerCentral上,十年前的一个线程建议在文件中添加一些MB,因为“重新设置内部计数器或开关会告诉它现在不在收缩中”。 这很有效-很棒。但是,谁能更详细地说明SQL Server内部的工作原理/原因?

5
如何通过SSMS拒绝对SQL Server的某些登录访问,但如何通过.Net SqlClient数据提供程序访问
在这种情况下,开发人员没有任何UPDATE权限,但是他们使用应用程序并看到连接字符串->他们知道一些SQLLogin1具有UPDATE权限的SQL帐户(示例)中的密码。目前,我们的操作还不够完善,有时还需要修改生产数据(目前还没有GUI)。 与其联系DBA并要求他修改数据,开发人员将(不当地)使用SQL帐户SQLLogin1(具有修改数据的权限),并通过SQL Server Management Studio连接以自己修改数据。 DBA无法更改密码,SQLLogin1除非开发人员看到新的连接字符串和新密码,因为使用的应用程序连接字符串SQLLogin1由开发人员维护。 题: 有一种方法可以拒绝对SQLLogin1SQL登录名的访问,但仅当它通过SSMS连接时才可以? 同时,如果SQLLogin1通过.Net SqlClient Data Provider(program_name中的sys.dm_exec_sessions)连接,则必须允许其登录。 这样,我们不想让Developer使用来通过SSMS进行连接SQLLogin1,而使用的应用程序SQLLogin1仍然可以进行连接。

3
筛选条件未正确应用于“群集列存储”索引
使用下面的示例,谓词是相同的,但是top语句(正确)返回0行,bottom语句返回1-即使谓词不匹配: declare @barcode nchar(22)=N'RECB012ZUKI449M1VBJZ' declare @tableId int = null declare @total decimal(10, 2) = 5.17 SELECT 1 FROM [dbo].[transaction] WITH (INDEX([IX_Transaction_TransactionID_PaymentStatus_DeviceID_DateTime_All])) WHERE Barcode = @barcode AND StatusID = 1 AND TableID = @tableID AND @total <= Total SELECT 1 FROM [dbo].[transaction] WHERE Barcode = @barcode AND StatusID = 1 AND …

4
在此SQL语句中使用双重内部联接的原因是什么?
我正在看这个旧的SQL查询。我无法得到的一点是为什么它在同一列上两次内部连接同一表。我说的是Table1和Table1,别名为“ Table1Alias”, SELECT DISTINCT othercolumns, Table1Alias.columna FROM maintable INNER JOIN secondarytable ON maintable.id1 = secondarytable.a_id1 INNER JOIN table1 ON secondarytable.id2 = table1.id3 INNER JOIN table1 Table1Alias ON secondarytable.id2 = Table1Alias.id3 INNER JOIN thirdtable ON table1.id4 = thirdtable.id5 INNER JOIN fourthtable ON thirdtable.id6 = fourthtable.id7 INNER JOIN fivetable ON thirdtable.id8 = …
10 sql-server 

1
什么规则确定何时SQL Server使用CTE作为“优化围栏”?
不久前,Brent Ozar发表了一篇文章,详细介绍了SQL Server和PostgreSQL之间的一些区别: SQL Server与PostgreSQL之间的两个重要区别 第一点(“ CTE是优化栅栏”)引起了我的注意,因为很明显,在所提供的示例中,SQL Server将CTE和主查询组合在一起,并将其优化为单个查询(与之相反的行为是, PostgreSQL)。 但是,此行为似乎与我在其他博客和培训课程中看到的示例相反,在这些示例中,SQL Server确实将CTE视为优化围栏,从而可以更好地使用索引,提高性能等。例如: 选择星号的更好方法 因此,似乎SQL Server有时会“荣誉” CTE作为优化的围栏。是否有可用的良好资源来记录已知情况的特定列表,在这些情况下,SQL Server将可靠地认可CTE作为优化范围(或相反的行为)?

2
为什么这样更快并且使用安全吗?(第一个字母在字母表中)
长话短说,我们正在用很小的人表中的值更新小的人表。在最近的测试中,此更新大约需要5分钟才能运行。 我们偶然发现了似乎最简单的优化方法,该方法似乎完美无缺!现在,同一查询可以在不到2分钟的时间内运行,并且可以完美地产生相同的结果。 这是查询。最后一行添加为“优化”。为什么查询时间急剧减少?我们错过了什么吗?这会在将来引发问题吗? UPDATE smallTbl SET smallTbl.importantValue = largeTbl.importantValue FROM smallTableOfPeople smallTbl JOIN largeTableOfPeople largeTbl ON largeTbl.birth_date = smallTbl.birthDate AND DIFFERENCE(TRIM(smallTbl.last_name),TRIM(largeTbl.last_name)) = 4 AND DIFFERENCE(TRIM(smallTbl.first_name),TRIM(largeTbl.first_name)) = 4 WHERE smallTbl.importantValue IS NULL -- The following line is "the optimization" AND LEFT(TRIM(largeTbl.last_name), 1) IN ('a','à','á','b','c','d','e','è','é','f','g','h','i','j','k','l','m','n','o','ô','ö','p','q','r','s','t','u','ü','v','w','x','y','z','æ','ä','ø','å') 技术说明:我们知道要测试的字母列表可能还需要几个字母。我们还意识到使用“ DIFFERENCE”时明显的错误余量。 查询计划(常规): https : //www.brentozar.com/pastetheplan/? id …

3
由于varchar(max),将溢出溢出排序到tempdb
在具有32GB的服务器上,我们正在运行SQL Server 2014 SP2,最大内存为25GB,我们有两个表,在这里您可以找到两个表的简化结构: CREATE TABLE [dbo].[Settings]( [id] [int] IDENTITY(1,1) NOT NULL, [resourceId] [int] NULL, [typeID] [int] NULL, [remark] [varchar](max) NULL, CONSTRAINT [PK_Settings] PRIMARY KEY CLUSTERED ([id] ASC) ) ON [PRIMARY] GO CREATE TABLE [dbo].[Resources]( [id] [int] IDENTITY(1,1) NOT NULL, [resourceUID] [int] NULL, CONSTRAINT [PK_Resources] PRIMARY KEY CLUSTERED ([id] ASC) …

2
大量添加逗号的最佳方法
我已经开始了一项新工作,其中涉及查看一大堆数字。是否有一种简单的方法可以将逗号添加到int或decimal字段以使其可读? 例如,SQL Server输出左侧的列,但出于我的理智,我需要使其看起来像右侧的列: 2036150 -> 2,036,150 ...或者我不得不写一些令人发指的东西 left(right(vandalized_data),6),3) + ',' + right(left(vandalized_data),6),3) 功能? 完美的做法是在显示网格中添加逗号,然后在输出中添加纯整数。

1
EXCEPT运算符背后的算法是什么?
在SQL Server的幕后,Except运算符如何工作的内部算法是什么?是否在内部对每行进行哈希处理并进行比较? David Lozinksi进行了一项研究,即SQL:在尚不存在的新记录中插入新记录的最快方法。与下面的结果紧密相关。 假设:我认为Left join最快,因为它只比较1列,而Except花费的时间最长,因为它必须比较All列。 有了这些结果,现在我们的思维是“除了自动且内部对每一行进行哈希处理?”。我看了看执行计划,它确实利用了一些哈希。 背景:我们的团队正在比较两个堆表。表A将不在表B中的行插入到表B中。 堆表(来自旧文本文件系统)没有主键/向导/标识符。一些表具有重复的行,因此我们找到了每一行的哈希,并删除了重复项,并创建了主键标识符。 1)首先,我们运行一个except语句,排除(hash列) select * from TableA Except Select * from TableB, 2)然后我们在HashRowId的两个表之间进行左联接比较 select * FROM dbo.TableA A left join dbo.TableB B on A.RowHash = B.RowHash where B.Hash is null 令人惊讶的是,例外声明插入是最快的。 结果实际上与David Lozinksi的测试结果很接近

1
尽管没有任何行受到影响,但触发触发
这更像是一个普遍的问题,但是这个问题的动机是我在使用SQL Server时遇到的一个问题。 我将此触发器附加到表上的Insert事件中,该事件包含一些逻辑,作为副作用,如果没有插入行,它将引发错误。经过进一步调查,我发现尽管没有插入行,但触发器仍在触发。 在DML触发器上的Microsoft文档中使用的语言似乎与以下行为矛盾: DML触发器是一种特殊的存储过程,当发生DML事件而该事件会影响触发器中定义的表或视图时,它会自动生效。 这是DBMS的默认行为吗?没有行受到影响时,是否有特定的原因触发触发器?

1
为什么不能使用sys.query_store_plan加入消除功能?
以下是查询存储遇到的性能问题的简化: CREATE TABLE #tears ( plan_id bigint NOT NULL ); INSERT #tears (plan_id) VALUES (1); SELECT T.plan_id FROM #tears AS T LEFT JOIN sys.query_store_plan AS QSP ON QSP.plan_id = T.plan_id; 该plan_id列被记录为的主键sys.query_store_plan,但是执行计划未按预期使用联接消除: 没有从DMV投影任何属性。 DMV主键plan_id不能复制临时表中的行 使用A LEFT JOIN,因此无法T消除中的任何行。 执行计划 为什么会这样?在这里如何做才能消除连接?


2
根据更改日志计算库存数量
假设您具有以下表结构: LogId | ProductId | FromPositionId | ToPositionId | Date | Quantity ----------------------------------------------------------------------------------- 1 | 123 | 0 | 10002 | 2018-01-01 08:10:22 | 5 2 | 123 | 0 | 10003 | 2018-01-03 15:15:10 | 9 3 | 123 | 10002 | 10004 | 2018-01-07 21:08:56 | 3 4 …

1
在Postgres中优化2000万行的“最新”查询
我的表如下所示: Column | Type | -----------------------+-------------------+ id | integer | source_id | integer | timestamp | integer | observation_timestamp | integer | value | double precision | 索引存在于source_id,timestamp以及timestamp和id(CREATE INDEX timeseries_id_timestamp_combo_idx ON timeseries (id, timeseries DESC NULLS LAST))的组合上 其中有2000万行(好的,有120M,但是有source_id = 1的20M)。它有许多相同的条目,timestamp且有所不同observation_timestamp,描述了一个value发生在timestamp报告或观察到的事件observation_timestamp。例如,明天下午2点预测的温度与今天上午12点预测的温度相同。 理想情况下,此表可以很好地完成一些工作: 批量插入新条目,有时一次插入10万 选择观察到的时间范围内的数据(“一月到三月的温度预测是多少”) 选择从某个点观察到的时间范围内观察到的数据(“如我们在11月1日所想到的,从1月到3月的温度预测如何看待”) 第二个是这个问题的核心。 表中的数据如下所示 id source_id timestamp observation_timestamp …

2
永不结束查询存储搜索
我从一开始说,我的问题/问题类似于此之前的一个,但因为我不知道的原因或起始信息是一样的,我决定后,我的问题有一些更多的细节。 当前问题: 在一个奇怪的时刻(工作日临近结束),生产实例开始出现异常行为: 实例的CPU较高(从约30%的基准开始,它增加了约一倍,并且仍在增长) 每秒增加的事务数(尽管应用程序负载未发生任何变化) 空闲会话数增加 从未显示此行为的会话之间发生奇怪的阻止事件(即使读取未提交的会话也导致了阻止) 等待间隔的最长时间是第一页上的非页面锁,第二名是锁 初步调查: 使用sp_whoIsActive,我们看到了由监视工具执行的查询决定运行速度非常慢,并占用大量CPU,这在以前是没有发生的。 隔离级别未提交; 我们查看了看到古怪数字的计划:StatementEstRows =“ 3.86846e + 010”,其中约150 TB的估计数据已返回 我们怀疑原因是监视工具的查询监视功能引起了,因此我们禁用了该功能(我们还与提供程序一起打开了一张票证,以检查他们是否知道任何问题) 从第一个事件开始,它又发生了几次,每次我们终止会话时,一切都恢复正常; 我们意识到查询极为相似的一个查询在BOL使用MS用于查询存储监测-查询,最近在性能倒退(在时间上比较不同点) 我们手动运行相同的查询并看到相同的行为(使用的CPU不断增加,闩锁等待时间增加,意外锁定等。) 有罪查询: Select qt.query_sql_text, q.query_id, qt.query_text_id, rs1.runtime_stats_id AS runtime_stats_id_1, interval_1 = DateAdd(minute, -(DateDiff(minute, getdate(), getutcdate())), rsi1.start_time), p1.plan_id AS plan_1, rs1.avg_duration AS avg_duration_1, rs2.avg_duration AS avg_duration_2, p2.plan_id AS plan_2, interval_2 = …

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.