Questions tagged «sql-server»

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


2
LOB_DATA,慢速表扫描和一些I / O问题
我有一个相当大的表,其中一列是XML数据,XML条目的平均大小约为15 KB。所有其他列都是常规int,bigints,GUID等。要获得一些具体数字,我们假设该表有100万行,大小约为15 GB。 我注意到的是,如果我要选择所有列,则从此表选择数据的速度确实很慢。当我做 SELECT TOP 1000 * FROM TABLE 从磁盘读取数据大约需要20-25秒-即使我没有对结果施加任何顺序。我使用冷缓存(即之后DBCC DROPCLEANBUFFERS)运行查询。以下是IO统计信息: 扫描计数1,逻辑读取364,物理读取24,预读7191,lob逻辑读7924,lob物理读1690,lob预读3968。 它捕获约15 MB的数据。执行计划按预期显示了聚集索引扫描。 除了查询外,磁盘上没有任何IO。我还检查了聚簇索引碎片是否接近0%。这是消费级的SATA驱动器,但是我仍然认为SQL Server能够以超过100-150 MB / min的速度扫描表。 XML字段的存在会导致大多数表数据位于LOB_DATA页上(实际上,约90%的表页都是LOB_DATA)。 我想我的问题是-我是否正确地认为LOB_DATA页会导致缓慢的扫描,不仅是因为它们的大小,还因为当表中有很多LOB_DATA页时,SQL Server无法有效地扫描聚集索引吗? 更广泛地讲-具有这样的表结构/数据模式是否合理?使用Filestream的建议通常会指出更大的字段大小,所以我真的不想走那条路。我还没有真正找到有关此特定情况的任何好信息。 我一直在考虑XML压缩,但是它需要在客户端或SQLCLR上完成,并且需要在系统中进行大量工作。 我尝试了压缩,并且由于XML是高度冗余的,因此我可以(在ac#应用程序中)将XML从20KB压缩到〜2.5KB并将其存储在VARBINARY列中,从而避免使用LOB数据页。在我的测试中,SELECT的速度提高了20倍。


2
口音敏感排序
为什么这两个SELECT语句导致排序顺序不同? USE tempdb; CREATE TABLE dbo.OddSort ( id INT IDENTITY(1,1) PRIMARY KEY , col1 NVARCHAR(2) , col2 NVARCHAR(2) ); GO INSERT dbo.OddSort (col1, col2) VALUES (N'e', N'eA') , (N'é', N'éB') , (N'ë', N'ëC') , (N'è', N'èD') , (N'ê', N'êE') , (N'ē', N'ēF'); GO SELECT * FROM dbo.OddSort ORDER BY col1 …

4
标识列上的索引是否应该非聚集?
对于具有标识列的表,是否应为标识列创建聚集或非聚集的PK /唯一索引? 原因是将为查询创建其他索引。使用非聚集索引(在堆上)并返回该索引未覆盖的列的查询将使用较少的逻辑I / O(LIO),因为没有额外的聚集索引b树查找步骤? create table T ( Id int identity(1,1) primary key, -- clustered or non-clustered? (surrogate key, may be used to join another table) A .... -- A, B, C have mixed data type of int, date, varchar, float, money, .... B .... C .... ....) create …

3
跟踪标志4199-全局启用?
这可能属于观点类别,但我很好奇是否人们使用跟踪标志4199作为SQL Server的启动参数。对于那些使用过它的人,您在什么情况下遇到查询回归? 当然,这似乎似乎是潜在的整体性能优势,我正在考虑在我们的非生产环境中在全球范围内启用它,并将其放置几个月以找出任何问题。 2014年(或2016年)默认情况下是否将4199中的修补程序纳入优化程序?尽管我理解不引入计划外更改的情况,但将所有这些修复隐藏在版本之间似乎很奇怪。 我们使用的是2008、2008R2,大部分使用的是2012。

2
锁定创建表
在另一个应用程序中,我被糟糕的设计所震惊:多个线程EnsureDatabaseSchemaExists()同时执行一个方法,基本上看起来像这样: IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'MyTable') AND type = N'U') BEGIN CREATE TABLE MyTable ( ... ); END 但是,即使在SERIALIZABLE事务中执行,此代码似乎也不是线程安全的(即,并行代码尝试多次创建表)。有没有机会强迫SELECT语句获取一个锁定,从而防止另一个线程执行相同的SELECT语句? 多线程EnsureSchemaExists()方法是否有更好的模式?

3
如何最好地衡量查询性能?
我有2个存储过程,其中第二个存储过程是第一个存储过程的改进。 我正在尝试确切地衡量这是多少改进。 1 /测量clock time似乎不是一种选择,因为我得到不同的执行时间。更糟糕的是,有时(很少,但确实会发生)第二个存储过程的执行时间大于第一个存储过程的执行时间(我想是由于当时服务器的工作量)。 2 / Include client statistics也提供不同的结果。 3 / DBCC DROPCLEANBUFFERS,DBCC FREEPROCCACHE是不错的,但同样的故事... 4 / SET STATISTICS IO ON可能是一种选择,但是由于我的存储过程中涉及许多表,我如何获得总体得分? 5 / Include actual execution plan也可以选择。estimated subtreecost对于第一个存储过程,我得到0.3253,对于第二个存储过程,我得到0.3079。我可以说第二个存储过程快了6%(= 0.3253 / 0.3079)吗? 6 /是否使用SQL Server Profiler中的“读取”字段? 那么,无论执行条件如何(服务器的工作负载,执行这些存储过程的服务器等),我怎么能说第二个存储过程比第一个过程快x%? 如果不可能,如何证明第二个存储过程比第一个存储过程有更好的执行时间?

8
列出给定登录名的所有映射用户的查询
查看特定登录名的属性时,可能会看到映射到该登录名的用户列表: 我分析了SQL Server Management Studio(SSMS),发现SSMS一次连接到每个数据库,并从sys.database_permissions中检索信息。 是否可以编写一个查询来检索上面显示的用户映射信息,或者我是否被迫使用游标或sp_MSforeachdb或类似的东西?

1
24x7 vs夜间窗口
在哪里可以找到有关如何更好地进行24x7作业的资源?具有大型数据库的大公司如何做到这一点?我们的夜间工作,例如 清除旧数据 重新索引 更新统计 所有这些似乎都对我们的系统造成了重大影响(即在线用户和实时数据馈送)。我在亚马逊上寻找过与此主题相关的任何书籍,但到目前为止还没有找到任何东西。
19 sql-server 

5
SQL Server 2012:从命令行生成脚本
我正在运行SQL Server 2012。 SQL Server Management Studio可以选择右键单击数据库,然后选择“任务”和“生成脚本”。 有没有一种方法可以通过命令行以某种方式使其自动化? 我想创建一个包含整个数据库的架构和数据的脚本。 之类的工具ScriptDB,并sqlpubwiz.exe似乎都针对SQL Server 2005的什么有关SQL Server 2012?

1
这个语法如何运作?{fn CurDate()}或{fn Now()}等
最近,我一直在浏览一些为SQL Server 2005编写的相当老的存储过程,并且发现一些我不理解的东西。它似乎是某种类型的函数调用。 一个样品: SELECT o.name, o.type_desc, o.create_date FROM sys.objects o WHERE o.create_date < {fn Now()} -1; 这将显示所有行sys.objects有一个create_date前24小时前。 如果显示此查询的执行计划,{fn Now()}则会看到该计划已被getdate()数据库引擎替换: SELECT [o].[name],[o].[type_desc],[o].[create_date] FROM [sys].[objects] [o] WHERE [o].[create_date]<(getdate()-@1) 显然,使用{fn Now()}远比钝GetDate()。我会避免像瘟疫这样的语法,因为它没有记录。

5
为什么链接服务器在CASE表达式中限制为10个分支?
为什么这样CASE表达: SELECT CASE column WHEN 'a' THEN '1' WHEN 'b' THEN '2' ... c -> i WHEN 'j' THEN '10' WHEN 'k' THEN '11' END [col] FROM LinkedServer.database.dbo.table 产生这个结果? 错误消息:消息8180,级别16,状态1,行1的语句无法准备。消息125,级别15,状态4,第1行Case表达式只能嵌套到级别10。 显然,这里没有嵌套CASE表达式,尽管有十多个“分支”。 另一个奇怪的地方。此内联表值函数产生相同的错误: ALTER FUNCTION [dbo].[fn_MyFunction] ( @var varchar(20) ) RETURNS TABLE AS RETURN ( SELECT CASE column WHEN 'a' THEN …

3
SQLCMD命令无法插入重音符号
我试图运行sqlcmd.exe以便从命令行设置新数据库。我正在Windows 7 64位上使用SQL SERVER Express 2012。 这是我使用的命令: SQLCMD -S .\MSSQLSERVER08 -V 17 -E -i %~dp0\aqualogyDB.sql -o %~dp0\databaseCreationLog.log 这是一部分sql文件创建脚本: CREATE DATABASE aqualogy COLLATE Modern_Spanish_CI_AS WITH TRUSTWORTHY ON, DB_CHAINING ON; GO use aqualogy GO CREATE TABLE [dbo].[BaseLayers] ( [Code] nchar(100) NOT NULL , [Geometry] nvarchar(MAX) NOT NULL , [IsActive] bit NOT NULL …

5
SQL Server 2008R2的最佳驱动器配置
我有一台运行SQL Server 2008 R2的非常繁忙的数据库服务器,该服务器具有以下设置: SATA RAID 1(2个驱动器)-操作系统/程序 SAS RAID 10(4个驱动器)-SQL数据库文件(数据和日志) SAS RAID 1(2个驱动器)-TempDB(数据和日志) 假设我无法在该服务器中添加其他驱动器,是否充分利用了可用的配置?还是我应该在这里考虑另一种方案,例如将日志与数据文件隔离开? 更新: 对于需要更多硬件详细信息的用户: SATA驱动器(用于OS / Program分区)是:WD 7200 RPM 3 Gb / s 3.5英寸SATA 其他阵列中使用的SAS驱动器是:Seagate 15K RPM 6 Gb / s 3.5英寸SAS 使用的RAID控制器是:LSI 9260-8i SAS / SATA 6 Gb 8端口 更新2: 基于我收到的反馈,它看起来像我有以下几个可行的方案可供选择-我将颁发奖金的人可以告诉我这是很可能是在环境最好的,我已经概述: 保留一切-我可能不会做得更好 将我的2个SAS RAID 1驱动器移到现有的RAID 10阵列中,使其总共由6个磁盘组成 将我的日志文件移动到SAS …

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.