Questions tagged «sql-server»

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

1
对SOS_SCHEDULER_YIELD等待进行故障排除
在运行我们的企业ERP(Dynamics AX 2012)时,我注意到我们的生产环境似乎比我们的开发系统慢得多。 在运行跟踪的同时在开发和生产环境中执行相同的活动后,我确认与开发相比,SQL查询在我们的生产环境中执行得非常慢(平均慢10到50倍)。 最初,我将其归因于负载,并在下班时间在生产环境上重新运行了相同的活动,并在跟踪中找到了相同的结果。 我在SQL Server中清除了等待统计信息,然后让服务器在其正常生产负载下运行了一段时间,然后运行了以下查询: WITH [Waits] AS (SELECT [wait_type], [wait_time_ms] / 1000.0 AS [WaitS], ([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS], [signal_wait_time_ms] / 1000.0 AS [SignalS], [waiting_tasks_count] AS [WaitCount], 100.0 * [wait_time_ms] / SUM ([wait_time_ms]) OVER() AS [Percentage], ROW_NUMBER() OVER(ORDER BY [wait_time_ms] DESC) AS [RowNum] FROM sys.dm_os_wait_stats …

4
连接在运行时是否优化到where子句?
当我写这样的查询... select * from table1 t1 join table2 t2 on t1.id = t2.id SQL优化器不确定将其翻译为...吗? select * from table1 t1, table2 t2 where t1.id = t2.id 从本质上讲,SQL Server中的Join语句只是编写sql的一种简便方法吗?还是在运行时实际使用? 编辑:我几乎总是并且几乎总是会使用Join语法。我很好奇发生了什么。


1
如何管理31亿行数据?
我目前的任务是为相对大量的数据实现存储模式。首先将访问数据以确定当前data point值,但我还需要跟踪过去六个月的数据趋势/分析历史。 添加了最近的要求以跟踪过去一小时的min/ max/ sum值。 注意:理想情况下,我想考虑使用MongoDB选项,但是我需要证明我已经首先用尽了SQL-Server选项。 数据 下表代表主要数据源(最常查询)。该表将有大约五百万行。在初始数据加载之后,数据更改将主要是UPDATE带有非常偶然的INSERT语句的语句。我已选择将数据聚类,dataPointId因为您将始终选择all values for a given data point。 // Simplified Table CREATE TABLE [dbo].[DataPointValue]( [dataPointId] [int] NOT NULL, [valueId] [int] NOT NULL, [timestamp] [datetime] NOT NULL, [minimum] [decimal](18, 0) NOT NULL, [hourMinimum] [decimal](18, 0) NOT NULL, [current] [decimal](18, 0) NOT NULL, [currentTrend] [decimal](18, 0) …

5
用于“巨大”数据库表PK的顺序GUID或bigint
我知道这类问题很多,但是我还没有阅读任何有说服力的论点来帮助我做出这个决定。请多多包涵! 我有一个庞大的数据库-它每天增长大约10,000,000条记录。数据是关系数据,出于性能原因,我将表与BULK COPY一起加载。因此,我需要为行生成键,并且不能依赖IDENTITY列。 64位整数(bigint)足够我使用,但是为了保证唯一性,我需要一个集中生成器来为我创建ID。我目前有这样的生成器服务,该服务允许服务保留X序列号并保证不发生冲突。但是,这样做的结果是,我拥有的所有服务都依赖于该集中式生成器,因此我在分配系统方面受到限制,并且对施加的其他依赖项(例如要求网络访问)不满意通过这种设计。有时这是一个问题。 我现在正在考虑使用顺序GUID作为主键(在SQL外部生成)。从我自己的测试中可以确定的是,这些操作的唯一缺点是较宽数据类型的磁盘空间开销(索引中使用它们会加剧这种情况)。与bigint相比,我还没有看到查询性能的任何明显下降。使用“批量复制”加载表的速度稍慢,但幅度不大。得益于我的顺序GUID实现,基于GUID的索引不会变得零散。 基本上,我想知道的是,是否还有我可能忽略的其他注意事项。目前,我倾向于飞跃并开始使用GUID。我绝不是数据库专家,所以我非常感谢任何指导。

2
列出现有的SQL Server登录名和用户
我知道我们可以使用SQL Server中的GUI来检查登录名和定义的用户,但是想知道如何使用脚本来执行此检查。 我在下面运行查询,但显示了Principal_id,我不确定该如何映射以获取权限级别。 SELECT * FROM Sys.login_token 那么,是否有任何内置存储的proc可以列出登录名和用户及其权限级别? 谢谢。

4
是否可以在具有数百万行的狭窄表上提高查询性能?
我有一个查询,目前平均需要2500毫秒才能完成。我的表很窄,但是有4400万行。我必须选择哪些选项来提高性能,或者说它达到了它的理想水平? 查询 SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats] WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31'; 桌子 CREATE TABLE [dbo].[Heartbeats]( [ID] [int] IDENTITY(1,1) NOT NULL, [DeviceID] [int] NOT NULL, [IsPUp] [bit] NOT NULL, [IsWebUp] [bit] NOT NULL, [IsPingUp] [bit] NOT NULL, [DateEntered] [datetime] NOT NULL, CONSTRAINT [PK_Heartbeats] PRIMARY KEY CLUSTERED ( [ID] …

3
在SQL Server 2012上运行大量SQL查询时系统磁盘空间不足
我是SQL Server 2012的新手,如果有人可以提供帮助,我将不胜感激。我已将大型数据库的副本还原到SQL Server 2012,并且尝试对它运行一些简单查询。 我试图对数据库的136898115行表运行SELECT查询。该SELECT查询只有一个简单WHERE子句。每次我运行此查询时,它都会失败,因为系统磁盘(安装Windows的分区- C:\)的空间不足(此分区只有6GB的可用空间),我不明白为什么。我将tempdb定义在另一个驱动器上,该驱动器具有14 TB以上的可用空间。当然,我的数据库也位于其他驱动器上。 是什么使我的系统分区空间不足?是页面文件吗?

3
分页时SQL Server查询变慢
我在SQL Server 2012中看到以下T-SQL查询的某些奇怪行为: SELECT Id FROM dbo.Person WHERE CONTAINS(Name, '"John" AND "Smith"') ORDER BY Name 仅执行此查询即可在不到两秒钟的时间内获得约1,300个结果(上有全文索引Name) 但是,当我将查询更改为此: SELECT Id FROM dbo.Person WHERE CONTAINS(Name, '"John" AND "Smith"') ORDER BY Name OFFSET 0 rows FETCH NEXT 10 ROWS ONLY 给我10个结果需要20秒钟以上。 以下查询甚至更糟: SELECT Id FROM ( SELECT ROW_NUMBER() OVER (ORDER BY Name) AS …

1
我如何找出*为什么*用户具有某些有效权限?
我知道我可以通过使用sys.fn_my_permissions以下命令查询有效权限: USE myDatabase; SELECT * FROM fn_my_permissions('dbo.myTable', 'OBJECT') entity_name | subentity_name | permission_name ------------------------------------------------ dbo.myTable | | SELECT dbo.myTable | | UPDATE ... 这告诉我当前用户是否对myTabledatabase 具有SELECT,INSERT,UPDATE等权限myDatabase。 是否可以轻松找出用户为何具有这些权限?例如,我很想拥有一个fn_my_permissions_ex输出附加reason列的函数: USE myDatabase; SELECT * FROM fn_my_permissions_ex('dbo.myTable', 'OBJECT') entity_name | subentity_name | permission_name | reason ------------------------------------------------------------------------------------------------------------------------------------ dbo.myTable | | SELECT | granted to database role …

5
提高sys.dm_db_index_physical_stats的性能
在维护工作期间,我正在尝试获取碎片索引的列表。但是查询非常慢,需要30多分钟才能执行。我认为这是由于对sys.dm_db_index_physical_stats进行的远程扫描。 有什么方法可以加快以下查询的速度: SELECT OBJECT_NAME(i.OBJECT_ID) AS TableName, i.name AS TableIndexName FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'DETAILED') phystat INNER JOIN sys.indexes i ON i.OBJECT_ID = phystat.OBJECT_ID AND i.index_id = phystat.index_id WHERE phystat.avg_fragmentation_in_percent > 20 AND OBJECT_NAME(i.OBJECT_ID) IS NOT NULL ORDER BY phystat.avg_fragmentation_in_percent DESC 我不是DBA,可能在上面的查询中犯了一个明显的错误,或者也许有些索引或统计信息会有所帮助?也许只是数据库的大小(大约20Gb,大约140个表)。 我问的原因是,我们在夜间只有一个很小的维护窗口,这在大多数时候都占用了。

4
SQL Server 2012向后兼容2008年备份
我有许多使用SQL Server 2008的客户端,这也是我在服务器上所拥有的。我使用备份文件在客户端之间以及在我的办公室之间来回发送数据库。 我已经读到,当您从SQL Server 2012创建备份时,无法将其还原到2008实例上。我认为兼容性级别可以解决此问题,但事实并非如此。因此,我对如何升级一无所知。除了一次升级所有我的客户(这是不可能的)之外,我可以想到没有干净的方法可以做到这一点。 我需要将数据库发送到客户端以及从客户端接收数据库。这是我在SQL Server上的第一个版本升级,因此我是这个问题的新手。关于如何进行的任何想法?
14 sql-server 

4
将多行中的列合并为单行
customer_comments由于数据库设计的缘故,我将某些内容分成了多行,而对于一份报告,我需要将comments每个唯一字段组合id成一行。我以前尝试过使用SELECT子句和COALESCE技巧在此定界列表中进行操作,但是我无法记住它并且一定不能保存它。在这种情况下,我似乎也无法使其工作,只能在单行上工作。 数据如下所示: id row_num customer_code comments ----------------------------------- 1 1 Dilbert Hard 1 2 Dilbert Worker 2 1 Wally Lazy 我的结果需要看起来像这样: id customer_code comments ------------------------------ 1 Dilbert Hard Worker 2 Wally Lazy 因此,每个row_num结果实际上只有一行结果;评论应按的顺序组合row_num。上面的链接SELECT技巧可以使特定查询的所有值作为一行获得,但是我无法弄清楚如何使其作为SELECT将所有这些行吐出来的语句的一部分来工作。 我的查询必须自己遍历整个表并输出这些行。我没有将它们组合成多列,每行一列,因此PIVOT似乎不适用。

3
如何在SQL Server上配置SSD驱动器的RAID阵列?
我正在构建一个具有48 GB RAM,1个CPU和8个SATA III(6GB / s)SSD驱动器(128 GB Crucial m4)和LSI MegaRAID控制器(SAS 9265-8i)的SQL Server。我希望典型的工作量主要来自阅读。会有一段时间的写入活动增加(与第三方数据提供者每小时进行一次数据同步-每晚备份),但是我怀疑典型的读写比率约为90%读取/ 10%写入。 选项1: 逻辑驱动器C:-RAID 1(2个物理驱动器)-OS 逻辑驱动器D:-RAID 10(6个物理驱动器)-DB文件/日志/ tempdb /备份? 要么 选项2: 逻辑驱动器C:-RAID 1(2个物理驱动器)-OS 逻辑驱动器D:-RAID 1(2个物理驱动器)-Db文件 逻辑驱动器E:-RAID 1(2个物理驱动器)-日志文件/备份? 逻辑驱动器F:-RAID 1(2个物理驱动器)-tempdb 要么 选项3: 其他建议? 我认为选项1会给我带来更好的性能,因为所有数据库活动都将在3个驱动器上进行条带化(并在阵列中的其他3个驱动器上进行镜像),尽管选项2似乎模仿了传统的观点(这似乎更适用于机械驱动器而不是SSD)。似乎选项1的堆栈溢出已消失。 我猜固态硬盘可以将所有东西都放在一个逻辑驱动器上,因为此时服务器可能受到更多CPU约束,而不是受I / O约束? 我还有一个问题是每晚备份应该放在哪里?我们不希望备份减慢SQL Server的其余部分的速度,并且我猜测将备份与日志写入相同的位置是一个好习惯,因为在这两种情况下,读/写行为都是顺序写入。

2
从传感器阵列存储大量数据
我受命实施一个解决方案(应用程序和数据库),以存储来自巨大传感器阵列的数据样本。该阵列目前由大约20,000个传感器组成,但是很快就会增长到多达100,000个传感器。每个传感器每10秒发送一次数据样本,每个样本的大小为28个字节。 这样求和会导致: 每个传感器每天8640个样本 每个传感器每天242kB的数据 每天8.64亿个样本 现在,我一直在想最好的方法是存储/检索数据?在指定了软件之后,我“加入”了这个项目,因此需要使用SQL Server在Windows平台上实现它。 我目前的解决方案是创建一个具有两个表的数据库来存储数据样本。第一个用作第二个的索引,第二个以每个传感器每天的基础将整理后的样本存储在二进制字段中: Table 1: RecordID - BigInt - Identity SensorID - BigInt - Primary Key Date - DateTime - Primary Key (yyyy-mm-dd) Table 2: RecordID - BigInt - Primary Key (from an insert into Table 1) Data - Binary 基本上,我会将所有传感器的样本写入临时文件(每个传感器1个)。每天结束时,我将在表1中创建一个条目,使用生成的RecordID并将文件转储到表2的“数据”字段中。 这样,我最终每天只向该表添加100,000个条目,而不是8.64亿个条目。数据应该在LAN或高速WAN上可用,因此可以全天检索传感器数据。 尽管必须存储所有数据,但大多数数据可能永远不会被读取。因此,在表上读取的数量将不会比写入的数量多得多。 我知道我可以通过仅存储数据文件的路径来使用文件系统来实现某些功能,但是我读到SQL Server的性能优于NTFS,而您的二进制字段则少了256kB。(在256kB和1MB之间存在一个灰色区域,而对于二进制大小> …

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.