数据库管理员

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

1
为什么此查询不使用索引假脱机?
我问这个问题是为了更好地了解优化器的行为并了解索引假脱机的限制。假设我将1到10000之间的整数放入堆中: CREATE TABLE X_10000 (ID INT NOT NULL); truncate table X_10000; INSERT INTO X_10000 WITH (TABLOCK) SELECT TOP 10000 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM master..spt_values t1 CROSS JOIN master..spt_values t2; 并强制嵌套循环加入MAXDOP 1: SELECT * FROM X_10000 a INNER JOIN X_10000 b ON a.ID = b.ID OPTION (LOOP JOIN, …

4
如果数据库只有一个插入,那么索引每个可能的列组合是否不好?
我正在一个需要大量选择查询的报表系统上工作,但是该报表系统基于仅填充一次的数据库。数据库管理系统是Microsoft SQL Server2017。可能有更好的方法来设计这样的系统,但让我们从理论上解决这个问题。 从理论上讲: 如果我们有一个非常大的数据库(几张表上有1.5亿行) 我们可以假设数据库只会被填充一次。 索引每个可能的列组合是否会对选择查询产生负面的性能影响?

1
无法在Mac上本地导入UTF-8编码的SQL数据库
我将确认的UTF-8编码的SQL数据库导入Mac上的Sequel Pro,并在中途抛出此错误: 读取文件时发生错误,因为无法以您选择的编码(自动检测-Unicode(UTF-8))读取文件。 仅执行了1273个查询。 这是因为数据库文件最初来自Windows计算机,并且是换行符,所以塞满了东西吗? 我想即使我尝试通过文件传输将相同的数据库发送到服务器,也会收到此错误,那么如何解决它的编码? -- MySQL dump 10.13 Distrib 5.5.40-36.1, for Linux (x86_64) -- -- Host: localhost Database: ***** -- ------------------------------------------------------ -- Server version 5.5.40-36.1-log /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET …

1
我的SQL Server是否打过补丁?
如何判断我的SQL Server实例是否已打补丁?是否有本机功能可以识别我的服务器是否有可用的补丁程序?哎呀,我什至有版本数据可用吗?
23 sql-server 

1
为什么此MERGE语句导致会话被终止?
我有以下MERGE针对数据库发出的声明: MERGE "MySchema"."Point" AS t USING ( SELECT "ObjectId", "PointName", z."Id" AS "LocationId", i."Id" AS "Region" FROM @p1 AS d JOIN "MySchema"."Region" AS i ON i."Name" = d."Region" LEFT JOIN "MySchema"."Location" AS z ON z."Name" = d."Location" AND z."Region" = i."Id" ) AS s ON s."ObjectId" = t."ObjectId" WHEN NOT …

3
归档当前年份以外的所有数据并同时对表进行分区的最佳方法是什么
任务 从一组大型表中存档,除了滚动13个月以外的所有时间。存档的数据必须存储在另一个数据库中。 数据库处于简单恢复模式 这些表是5000万行到数十亿行,在某些情况下,每行占用数百GB。 这些表当前未分区 每个表在不断增加的日期列上都有一个聚集索引 每个表还具有一个非聚集索引 对表的所有数据更改都是插入 目标是最大程度地减少主数据库的停机时间。 服务器是2008 R2 Enterprise “存档”表将包含约11亿行,“活动”表将包含约4亿行。显然,存档表会随着时间的推移而增加,但是我希望实时表也会迅速增加。至少在接下来的几年中说50%。 我曾考虑过Azure拉伸数据库,但不幸的是,我们现在使用的是2008 R2,并且可能会在其中停留一段时间。 当前计划 创建一个新的数据库 在新数据库中创建按月分区的新表(使用修改的日期)。 将最近的12-13个月的数据移到分区表中。 对两个数据库进行重命名交换 从现在的“归档”数据库中删除移动的数据。 对“归档”数据库中的每个表进行分区。 将来使用分区交换来存档数据。 我的确意识到,我将不得不交换要存档的数据,将该表复制到存档数据库,然后将其交换到存档表中。这是可以接受的。 问题: 我正在尝试将数据移到初始分区表中(实际上,我仍在对其进行概念验证)。我正在尝试使用TF 610(根据《数据加载性能指南》)和一条INSERT...SELECT语句来移动数据,最初认为该数据将被最少地记录。不幸的是,每次我尝试将其完全记录下来。 在这一点上,我认为我最好的选择可能是使用SSIS包移动数据。我试图避免这种情况,因为我正在使用200个表,而我可以通过脚本轻松地生成和运行的任何事情。 我的总体计划中是否缺少任何内容?SSIS是否是我最好的选择,它可以快速移动数据并以最少的日志使用量(空间问题)? 没有数据的演示代码 -- Existing structure USE [Audit] GO CREATE TABLE [dbo].[AuditTable]( [Col1] [bigint] NULL, [Col2] [int] NULL, [Col3] [int] NULL, [Col4] [int] …

1
不可修复的空间索引损坏是否被视为正常现象?
我有一个空间索引用于该DBCC CHECKDB报告损坏: DBCC CHECKDB(MyDB) WITH EXTENDED_LOGICAL_CHECKS, DATA_PURITY, NO_INFOMSGS, ALL_ERRORMSGS, TABLERESULTS 空间索引,XML索引或索引视图'sys.extended_index_xxx_384000'(对象ID xxx)不包含视图定义生成的所有行。这不一定代表此数据库中数据的完整性问题。 空间索引,XML索引或索引视图'sys.extended_index_xxx_384000'(对象ID xxx)包含视图定义未生成的行。这不一定代表此数据库中数据的完整性问题。 CHECKDB在表'sys.extended_index_xxx_384000'(对象ID xxx)中发现了0个分配错误和2个一致性错误。 维修等级为repair_rebuild。 删除并重新创建索引不会删除这些损坏报告。没有EXTENDED_LOGICAL_CHECKS但没有DATA_PURITY错误,则不会报告。 同样,CHECKTABLE此表花费45分钟,尽管它的CI大小为30 MB,大约有3万行。该表中的所有数据都是点geography数据。 在任何情况下都可以预期这种行为吗?它说:“这不一定代表完整性问题”。我应该做些什么?CHECKDB失败了,这是一个问题。 此脚本重现了该问题: CREATE TABLE dbo.Cities( ID int NOT NULL, Position geography NULL, CONSTRAINT PK_Cities PRIMARY KEY CLUSTERED ( ID ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, …

4
使用Windows身份验证时,SQL Server Management Studio连接缓慢或超时
尝试使用Windows身份验证通过TCP连接到SQL Server 2012实例时,SQL Server Management Studio 2014出现了非常长的延迟(10〜30秒)。连接对象资源管理器或新的空白查询窗口时,会发生这种情况。连接后,运行查询很快。当我使用SQL Server身份验证进行连接时,不会发生此问题。 环境: Windows 7,以域用户身份登录 通过IP地址的TCP连接(不是主机名) 服务器位于通过VPN连接的远程位置 没有加密 当我使用我的域帐户登录到同事的Windows 7计算机上并通过同一VPN连接到同一SQL Server时,没有延迟。当同一位同事使用自己的域帐户登录我的PC时,他遇到了延迟。这些测试表明问题是我的PC独有的。同样,仅当连接到此特定的SQL Server和VPN时,才会出现问题。我可以通过Windows身份验证立即连接到本地网络上的其他SQL Server。 我尝试过的没有成功的事情: 禁用的防病毒和防火墙 将“%userprofile%\ AppData \ Roaming \ Microsoft \ SQL Server Management Studio”下的“ 12.0”文件夹重命名为“ _12.0”,以强制SSMS重新创建我的用户设置。 将网络协议强制为TCP,而不是TCP <default>。我也尝试过命名管道,但是没有为此设置服务器。 安装了SSMS 2012,并尝试使用它而不是2014。 禁用的IPv6 在我的etc \ hosts文件中将Blackholed crl.microsoft.com更改为127.0.0.1。 在SSMS,Visual Studio和Windows中禁用了“客户体验改善计划”。 从我的PC上卸载所有与SQL Server相关的应用程序,仅在2012年重新安装。 TCPView线索: 使用TCPView,我注意到当我建立一个新的连接时,它的状态立即变为ESTABLISHED,但是随后又不断尝试与SQL Server建立一个或两个连接,并使用TIME_WAIT关闭它。在我同事的计算机上,这些连接已建立且牢固。因此,我很确定这是超时的根源,但是连接的目的是什么,为什么连接失败?(我的SSMS中没有任何插件。) …

5
从DMV中,您能否确定连接是否使用了ApplicationIntent = ReadOnly?
我设置了一个Always On可用性组,我想确保我的用户在其连接字符串中使用ApplicationIntent = ReadOnly。 从SQL Server通过DMV(或扩展事件或其他),我能否确定用户的连接字符串中是否与ApplicationIntent = ReadOnly连接? 请不要回答如何防止连接-这不是这个问题。我不能简单地停止连接,因为我们现有的应用程序在连接时没有正确的字符串,我需要知道它们是哪个,以便我与开发人员和用户一起逐步解决问题。 假设用户有多个应用程序。例如,鲍勃与SQL Server Management Studio和Excel连接。当他需要更新时,他与SSMS连接;当他需要读取时,他与Excel连接。我需要确保他与Excel连接时正在使用ApplicationIntent = ReadOnly。(这不是确切的情况,但是足够接近以说明问题。)




2
SQL Server的READ COMMITTED SNAPSHOT与SNAPSHOT
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 6年前。 我正在研究SQL Server READ COMMITTED SNAPSHOT和SNAPSHOT隔离级别之间的差异,并且遇到了以下资源: 选择基于行版本控制的隔离级别 对于大多数应用程序,由于以下原因,建议使用行版本控制的读取提交隔离而不是快照隔离: 与快照隔离相比,它占用的tempdb空间更少。 快照隔离很容易受到更新冲突的影响,这些更新冲突不适用于使用行版本控制读取已提交的隔离。当在快照隔离下运行的事务读取数据,然后由另一个事务修改该数据时,快照事务对同一数据的更新将导致更新冲突,并且该事务终止并回滚。使用行版本控制的读取提交隔离不是问题。 我对这些主题有些陌生,但是我似乎无法理解上面链接中的两个要点。 对于这些模式,为什么tempdb空间会有所不同?一个存储比另一个存储更多的粒度版本吗? 为什么快照隔离更容易受到更新冲突的影响?

1
如何在表格模型中计算/存储前10名?
我们最近创建了一个SSAS表格模型,因此我们的用户可以通过PowerView访问它。我们对其中一个事实表进行度量以TotalActiveItems使用公式: TotalActive:=COUNTAX(FILTER('Stats', ISBLANK([DeactDate]) = TRUE), 1) 这可以根据需要很好地工作,但是现在我们要求获得每月的前10名父母TotalActive。 供参考,这是我们模型的一部分: create table factStats ( StatsID INT IDENTITY NOT NULL PRIMARY KEY, DevID INT NOT NULL, DeactDate DATETIME NULL, BillDateTimeID BIGINT NOT NULL, CustID INT NOT NULL, ParentID INT NOT NULL ); create table dimCust ( CustID INT NOT NULL PRIMARY KEY, CustName …

2
从一个存储过程启动3个存储过程时如何回滚
我有一个存储过程,其中仅执行3个存储过程。如果主控SP成功,我仅使用1个参数进行存储。 如果第一个存储过程在主存储过程中工作正常,但是第二个存储过程失败,那么它将自动回滚主SP中的所有SP还是我必须发出一些命令? 这是我的程序: CREATE PROCEDURE [dbo].[spSavesomename] -- Add the parameters for the stored procedure here @successful bit = null output AS BEGIN begin transaction createSavebillinginvoice begin Try -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; BEGIN EXEC [dbo].[spNewBilling1] END …

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.