Questions tagged «sql-server»

所有版本的Microsoft SQL Server(非MySQL)。还请添加特定于版本的标记,例如sql-server-2016,因为它通常与问题相关。

4
什么是对表进行大的更改更好的方法:每次都删除或插入,或者存在UPDATE?
我正在做一个项目,每天需要在一张桌子中更改约36000条记录。我想知道什么会更好地执行: 删除行并插入新行,或者 更新现有的行 对我来说,删除所有行并插入新行比较容易,但是如果这将使表和索引碎片化并影响性能,那么我希望尽可能进行更新并仅在必要时删除/插入。 这将是每晚的服务,我不希望提高流程本身的速度。我更关注针对该表的查询的性能,总体而言,我已经有8900万条记录,以及该每晚过程将如何影响它。 我应该删除/插入记录,还是应该在每晚过程中更新现有记录(如果可能)?

3
SQL Server将A <> B拆分为A <B或A> B,如果B是不确定的,则会产生奇怪的结果
我们在SQL Server中遇到了一个有趣的问题。考虑以下repro示例: CREATE TABLE #test (s_guid uniqueidentifier PRIMARY KEY); INSERT INTO #test (s_guid) VALUES ('7E28EFF8-A80A-45E4-BFE0-C13989D69618'); SELECT s_guid FROM #test WHERE s_guid = '7E28EFF8-A80A-45E4-BFE0-C13989D69618' AND s_guid &lt;&gt; NEWID(); DROP TABLE #test; 小提琴 请暂时忘记这种s_guid &lt;&gt; NEWID()情况似乎毫无用处-这只是一个最小的复制示例。由于NEWID()匹配某个给定常数的可能性非常小,因此每次都应将其评估为TRUE。 但事实并非如此。运行此查询通常返回1行,但有时(非常频繁,在10中超过1次)返回0行。我已经在系统上使用SQL Server 2008对其进行了复制,您可以使用上面链接的小提琴(SQL Server 2014)在线对其进行复制。 查看执行计划可以发现查询分析器显然将条件分为s_guid &lt; NEWID() OR s_guid &gt; NEWID(): ...这完全解释了为什么有时会失败(如果第一个生成的ID小于给定ID,而第二个ID大于给定ID)。 即使其中一个表达式不是确定性的,也允许SQL Server将其评估A &lt;&gt; …

1
访问相同的LOB数据时逻辑读取不同
这是三个读取相同数据,但报告逻辑读取非常不同的简单测试: 设定 下面的脚本创建一个包含100个相同行的测试表,每个表包含一个xml列,其中包含足够的数据以确保其存储在行外。在我的测试数据库中,每行生成的xml的长度为20204字节。 -- Conditional drop IF OBJECT_ID(N'dbo.XMLTest', N'U') IS NOT NULL DROP TABLE dbo.XMLTest; GO -- Create test table CREATE TABLE dbo.XMLTest ( ID integer IDENTITY PRIMARY KEY, X xml NULL ); GO -- Add 100 wide xml rows DECLARE @X xml; SET @X = ( SELECT TOP (100) …

2
为什么LEN()函数严重低估了SQL Server 2014中的基数?
我有一个带有字符串列和谓词的表,该谓词检查具有一定长度的行。在SQL Server 2014中,无论我要检查的长度如何,我都会看到1行的估计。这产生了非常糟糕的计划,因为实际上有成千上万甚至上百万的行,并且SQL Server选择将此表放在嵌套循环的外侧。 对于SQL Server 2014的基数估计为1.0003,而SQL Server 2012的基数估计为31,622,是否有解释?有没有好的解决方法? 以下是问题的简短摘要: -- Create a table with 1MM rows of dummy data CREATE TABLE #customers (cust_nbr VARCHAR(10) NOT NULL) GO INSERT INTO #customers WITH (TABLOCK) (cust_nbr) SELECT TOP 1000000 CONVERT(VARCHAR(10), ROW_NUMBER() OVER (ORDER BY (SELECT NULL))) AS cust_nbr FROM master..spt_values v1 CROSS …

6
ON与WHERE的索引表现
我有两张桌子 @T1 TABLE ( Id INT, Date DATETIME ) @T2 TABLE ( Id INT, Date DATETIME ) 这些表在(Id,Date)上具有非聚集索引 我加入这些表 SELECT * FROM T1 AS t1 INNER JOIN T2 AS t2 ON t1.Id = t2.Id WHERE t1.Date &lt;= GETDATE() AND t2.Date &lt;= GETDATE() 这也可以写成 SELECT * FROM T1 AS t1 INNER …

4
由于“ XTP_CHECKPOINT”,数据库“ database_name”的事务日志已满
我有一个问题XTP_CHECKPOINT。 我正在使用SQL Server2014。我有一个处于简单恢复模型模式的数据库。它也在被复制。 没有公开交易。我已经跑了DBCC OPENTRAN,它返回: “没有活跃的公开交易。” 但是,每当我尝试创建或删除表或删除数据时,我都会不断收到此消息:( 我用单词替换了实际的数据库名称database_name) “由于'XTP_CHECKPOINT',数据库'database_name'的事务日志已满” 有谁知道为什么会发生这种情况,更重要的是,我如何才能阻止这种情况发生? 是的,数据库确实处于SIMPLE恢复模型模式。即,事务日志应自动截断。 顺便说一句,我处于完全恢复模式的另一个数据库做了同样的事情,开始返回同样的错误: 由于“ XTP_CHECKPOINT”,数据库“ database_name”的事务日志已满 我试图将日志增长设置更改为无限制增长,但它不允许我返回相同的错误。 除了文件组之外,我完全不需要任何XTP东西就可以重现该问题。方法如下:http : //pastebin.com/jWSiEU9U

2
用户定义函数的优化问题
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 4年前。 我有一个问题,为什么SQL Server决定为表中的每个值调用用户定义的函数,即使应该只提取一行。实际的SQL复杂得多,但是我能够将问题减少到这个程度: select S.GROUPCODE, H.ORDERCATEGORY from ORDERLINE L join ORDERHDR H on H.ORDERID = L.ORDERID join PRODUCT P on P.PRODUCT = L.PRODUCT cross apply dbo.GetGroupCode (P.FACTORY) S where L.ORDERNUMBER = 'XXX/YYY-123456' and L.RMPHASE = '0' and L.ORDERLINE = '01' 对于此查询,SQL Server决定为PRODUCT表中存在的每个单个值调用GetGroupCode函数,即使从ORDERLINE返回的估计行数和实际行数为1(这是主键): 计划浏览器中的同一计划显示行数: …

4
何时使用CDC跟踪历史记录?
SQL Server更改数据捕获是一项功能,可从SQL Server事务日志中读取历史数据并将其存储在特殊表中。 然后,通过使用特殊的表值函数(TVF),它允许用户查询此数据,从而有可能获得特定表上的所有更改,或者仅获得特定时间内由更改导致的净更改。 CDC具有一定优势 可以将其配置为仅跟踪某些表或列。 它能够在一定程度上处理模型更改。 它不会像触发器那样严重影响性能,因为它可以与事务日志一起使用。 它很容易启用/禁用,并且不需要在表上跟踪其他列。 它还有一些缺点: 历史数据的数量可以快速变得巨大。 您无法跟踪更改的对象(至少不能删除)。 由于历史数据是基于事务日志的,因此需要花费一些时间来追赶。 它取决于SQL Server代理。如果代理未运行或崩溃,则不会跟踪任何历史记录。 我已经阅读了很多有关CDC的文章,虽然我现在知道如何使用它,但是我仍然不确定它是否适合我。 CDC对于哪些任务/方案是正确的工具?(例如,是否允许用户将数据对象还原到某个时间点?审核?显示数据的完整历史记录?) 您什么时候不应该使用CDC,而应该使用基于触发器的自定义解决方案? 是否可以在运营数据库中使用CDC并在运营应用程序中使用CDC数据?(例如,将其显示给最终用户)还是这显然是滥用此功能? 我通常听到CDC是一种审核工具,但是这不是SQL Server Audit的目的吗?它们是否都是用于同一任务的不同工具?还是CDC可以用于其他用途? 我目前的情况是要求我构建一个可靠的数据框架,该框架应该作为将来多个应用程序的基础。确切的要求是模糊的,但是一个要求是它应该能够跟踪数据历史记录,并将旧条目以及其他表中的所有相关数据还原。我现在正在评估CDC作为一种选择,但是不确定是否要这样做,因为我找不到真正推荐的用例。 虽然我很欣赏针对我的特定情况的建议,但是答案应该提供有关何时或何时不使用Change Data Capture的一般建议。

2
当表引用自身时,如何编写查找所有循环引用的查询?
我有以下架构(名称已更改),无法更改: CREATE TABLE MyTable ( Id INT NOT NULL PRIMARY KEY, ParentId INT NOT NULL ); ALTER TABLE MyTable ADD FOREIGN KEY (ParentId) REFERENCES MyTable(Id); 也就是说,每个记录都是另一个记录的子级。如果一条记录ParentId等于它的Id,则该记录被视为根节点。 我想运行查询,将找到所有循环引用。例如,与数据 INSERT INTO MyTable (Id, ParentId) VALUES (0, 0), (1, 0), (2, 4), (3, 2), (4, 3); 查询应返回 Id | Cycle 2 | 2 …

2
如何分析存储过程
我正在使用SQL Server 2012,并且想知道如何配置存储过程 例如,探查器可以捕获存储过程中的每个单独的SQL语句,它是什么以及运行需要多长时间等? 我正在尝试诊断合并复制存储过程,并且必须在合并代理的完整运行中捕获这一点。似乎不可能抓住存在性能问题的存储过程并再次运行它,因为这并不慢。

6
删除大量行后,SQL Server数据库大小没有减少。
此问题已从超级用户迁移,因为可以在数据库管理员堆栈交换中回答。 迁移 7年前。 我的SQL不好,但是我需要维护一个数据库。 几乎没有剩余空间了,所以我决定删除2008年的所有数据。在执行delete查询(已清理了大约10000000行)并清理了事务日志后,我发现操作对数据库大小没有影响。我还有什么需要做的吗?

2
如何查找导致tempdb增长的SQL语句?
服务器(SQL Server 2008)的tempdb每月增加几次,达到500GB +。是否有可能找出导致该问题的SQL语句?这个问题通常不是由造成create table #temp...; insert into #temp...或select ... into #temp...而又复杂的连接。 某些tempdb文件的Initial Size每次也会自动设置为更大的值。怎么预防呢? 有时,缓存的计划会阻止调整大小/缩小文件。如何找到哪个持有tempdb?

2
在多租户数据库体系结构中处理越来越多的租户
对于每个租户的应用程序实例,在具有单独数据库的公共服务器中处理少量客户(租户)相对简单,通常是正确的方法。目前,我正在研究每个租户都有自己的数据库实例的应用程序的体系结构。 但是,问题在于此应用程序将具有大量的租户(5,000-10,000),并且用户数量很多,单个租户可能为2,000。我们将需要支持每周由几个租户扩展该系统。 此外,将为所有租户及其用户提供一个通用的登录过程(即每个租户不能拥有自己的URL)。为此,我需要一个集中的登录过程以及一种将数据库动态添加到系统并注册用户的方法。 如何可靠地自动化注册和数据库创建过程? 是在系统上创建和注册租户数据库的过程可能会导致性能或锁定问题吗?如果您认为这可能是一个问题,那么有人可以建议减轻它的方法吗? 如何以一种将用户凭据与特定租户的数据库关联但用户可以通过公共页面登录(即全部通过相同的登录URL,但他们的家庭应用程序将位于某个特定租户的数据库中)的方式管理集中身份验证)。租户必须能够维护自己的登录名和权限,但是中央登录系统必须知道这些。有人可以建议一种方法吗? 如果我需要通过添加多个数据库服务器来“横向扩展”,那么有人可以建议我管理跨服务器的用户身份(模拟等)时可能要处理的问题以及减轻这些问题的某种方法吗?

3
什么是“混沌”隔离级别?何时使用?
ADO.NET文档显示了将SQL事务的事务级别设置为Chaos的可能性。听起来不愉快,但是如果该功能存在,那么大概可以合理使用。 BOL中的SET TRANSACTION ISOLATION LEVEL命令(啊!看,我可以使用google和BOL)似乎什么都没有命名为“ chaos”,并且ADO.NET确实有5种模式,除了“ chaos”之外,它们还与已记录的级别很好地匹配 这个混沌水平是做什么的?(为什么它的名称不友好?) 参考: ADO.NET枚举

3
是否可以同时还原sql-server bak和缩小日志?
我们有一个来自客户的bak文件,我们已将其转移到我们的开发人员办公室以进行问题调查。当前备份为25GB,还原的数据库大小大致相同,但是需要还原100GB。我相信这是因为那里的数据库设置为具有75GB的事务日志大小。还原数据库后,我们可以收缩日志文件,但是在还原中有没有办法做到这一点?

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.