Questions tagged «sql-server»

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

1
SQL Server存储过程命名
我们已经开始将存储过程命名为[16_TestStoredProc]。命名这样的存储过程有什么含义吗? 我不会解释为什么我们要这样做。我不是对此有任何疑问,但可能有任何影响。

1
在这种情况下将使用哪个索引?
SQL Server 2014标准版 我需要找到特定月份往返特定城市的航班数量。例如 select count(*) from flights where flightTo_AirportCode = 'aaaa' and flightFrom_Airportcode = 'bbbb' and flightdate < '2016-04-01' and flightdate > '2016-02-28' ; 表模式如下。 我正在尝试评估索引模型A或索引模型B(如下)是否更可取(建立索引需要花费数小时,并且磁盘空间一次只能存在一个,因此我想在跳之前先进行研究)。 根据我的经验,任何一个索引都可以。我对吗? create index [modelA] on flights (flightTo_AirportCode, flightFrom_AirportCode, flightDate) create index [modelB] on flights (flightDate, flightTo_AirportCode, flightFrom_AirportCode) (或者,更好的是,我可以使用二进制索引或高级机制来解决这个问题吗?) CREATE TABLE [dbo].[flights]( [flightId] [uniqueidentifier] …

2
奇数流聚合行为
查询: declare @X xml = ' <item ID = "0"/> <item ID = "1"/> <item/> <item/>'; select I.X.value('@ID', 'int') from @X.nodes('/item') as I(X); 结果: ----------- 0 1 NULL NULL 执行计划: 顶部分支将XML切成四行,底部分支获取该属性的值ID。 让我感到奇怪的是,从Stream Aggregate运算符返回的行数。来自筛选器的2行是XML中ID第一个和第二个item节点的属性。流聚合返回四行,每一输入行一个,有效地将“内部联接”转换为“外部联接”。 这是否也是Stream Aggregate在其他情况下所做的事情,还是在进行XML查询时发生的奇怪事情? 我在查询计划的XML版本中看不到任何暗示,此Stream Aggregate的行为应与我之前注意到的任何其他Stream Aggregate有所不同。

10
如何在标准SQL或T-SQL中生成1、2、3、3、2、1、1、2、3、3、2、1…系列?
给定两个数字n和m,我想生成一系列的表格 1, 2, ..., (n-1), n, n, (n-1), ... 2, 1 并重复m一次。 例如,对于n = 3和m = 4,我需要以下24个数字组成的序列: 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1 ---------------- ---------------- ---------------- ---------------- 我知道如何通过两种方法之一在PostgreSQL中实现此结果: 使用以下查询,该查询使用该generate_series函数,以及一些技巧以确保顺序正确: WITH parameters (n, …

4
SQL Server无法在简单双射上使用索引
这是另一个查询优化器难题。 也许我只是高估了查询优化器,或者我错过了一些东西,所以我把它放在了那儿。 我有一张简单的桌子 CREATE TABLE [dbo].[MyEntities]( [Id] [uniqueidentifier] NOT NULL, [Number] [int] NOT NULL, CONSTRAINT [PK_dbo.MyEntities] PRIMARY KEY CLUSTERED ([Id]) ) CREATE NONCLUSTERED INDEX [IX_Number] ON [dbo].[MyEntities] ([Number]) 带有一个索引和几千行,Number均匀分布在值0、1和2中。 现在这个查询: SELECT * FROM (SELECT [Extent1].[Number] AS [Number], CASE WHEN (0 = [Extent1].[Number]) THEN 'one' WHEN (1 = [Extent1].[Number]) THEN 'two' …

3
如果有许多用户,则DROP USER将花费太长时间
在具有足够RAM和快速磁盘的SQL Server 2014实例上,有160多个用户可以访问数据库。由于某些我不知道的原因,DROP USER [username]在此数据库中运行该命令每个用户最多需要5秒钟。 重新映射用户以登录并恢复其权限非常快。 在从生产中刷新DEV数据库的上下文中,我必须删除并重新创建所有数据库用户。因此,必须删除数据库用户并重新创建它们。 如何加快DROP USER命令速度? 请记住,对于我正在写的实例,我必须运行160次以上。 这是我正在使用的SQL: DECLARE drop_user_cur CURSOR FOR SELECT name FROM #drop_users OPEN drop_user_cur FETCH NEXT FROM drop_user_cur INTO @user WHILE @@FETCH_STATUS = 0 BEGIN SET @sql = 'use [' + @db_name + '] DROP USER [' + @user + ']' BEGIN TRY …

1
文件组的好处以及将文件组设置为只读
在将多个文件组更改为只读是一个不错的选择以及何时使用它们的情况下,有人可以引用我的真实场景吗?如果将其设置为只读,会有什么好处? 在具有多个文件组的数据库上,您是否需要对整个数据库进行备份,还必须备份该文件组中的每个文件?您还能给我一个何时使用文件组备份的示例吗?我不明白为什么只备份整个数据库对备份文件组会有好处。希望我能获得现实的经验,此文件组备份将是理想的选择

1
使用CEILING时,CASE表达式返回错误的值
我遇到了一个问题,就是CASE表达式无法返回我期望的结果。 作为测试,我添加了一个十进制变量并对它运行相同的CASE表达式,它运行良好,返回的结果与我期望的一样(将值四舍五入IsGun=1。但是当我CASE对另一个十进制值运行相同的表达式时,它总是返回CEILING()函数的值,并且永远不会返回原始值。 这是SQL代码: DECLARE @Num decimal(8,2); set @Num = 12.54; WITH PQ AS ( SELECT UPC, Price1, DBID, AVG(Price1) OVER (PARTITION BY UPC) AS Price1Avg FROM vProducts_PriceQty_Union ) SELECT PQ.UPC, PQ.Price1, PQ.Price1Avg, (CASE WHEN p.IsGun = 1 THEN CEILING(@Num) ELSE @Num END) AS UsingVar, CAST( (CASE WHEN P.IsGun = 1 …

4
格式为:YYYYNNNNNN的“ Id”,其中NNNNNN部分每年重新开始
我有一个业务需求,即发票表中的每个记录都有一个看起来像YYYYNNNNNN的ID。 NNNNNN部分需要在每年年初重新启动。因此,2016年输入的第一行看起来像2016000001,第二行看起来像2016000002等。假设2016年的最后一条记录是2016123456,下一行(2017年)应该看起来像2017000001 我不需要此ID作为主键,并且我也存储创建日期。这个想法是,这个“显示ID”是唯一的(因此我可以通过它查询),并且可以按年份分组。 任何记录都不太可能被删除;但是,我倾向于针对此类内容进行防御性编码。 有什么方法可以创建此ID,而不必在每次插入新行时都查询今年的最大ID? 想法: A CreateNewInvoiceSP,获得当年的MAX值(讨厌) 一些神奇的内置功能可以做到这一点(我可以梦到了) 能够在IDENTITYor DEFAULT声明(??)中指定一些UDF或其他内容 使用的视图PARTITION OVER + ROW()(被删除将是有问题的) 触发INSERT(仍然需要运行一些MAX查询:() 一年一次的后台工作,用每年插入的MAX来更新一张表格,然后我...有事吗? 所有这些都不理想。任何想法或变化都欢迎!
11 sql-server  t-sql 


3
具有高选择性和低选择性字段的复合索引顺序中的字段顺序
我有一个超过30亿行的SQL Server表。我的查询之一花费了很长时间,因此我正在考虑对其进行优化。查询如下所示: SELECT [Enroll_Date] ,Count(*) AS [Record #] ,Count(Distinct UserID) AS [User #] FROM UserTable GROUP BY [Enroll_Date] [Enroll_Date]是一个低选择性列,可能值少于50个,而UserID列是高选择性列,其中有2亿多个不同的值。根据我的研究,我相信我应该在这两列上创建非聚集复合索引,并且从理论上讲,高选择性列应该是第一列。但是我不确定我的工作是否可行,因为我在group by子句中使用了低选择性列。 该表没有聚簇索引。

5
反转可返回UNKNOWN的布尔表达式
例 我有桌子 ID myField ------------ 1 someValue 2 NULL 3 someOtherValue 以及一个T-SQL布尔表达式,其值可以为TRUE,FALSE或(由于SQL的三元逻辑)UNKNOWN: SELECT * FROM myTable WHERE myField = 'someValue' -- yields record 1 如果我想获取所有其他记录,则不能简单地取反表达式 SELECT * FROM myTable WHERE NOT (myField = 'someValue') -- yields only record 3 我知道为什么会这样(三元逻辑),并且我知道如何解决这个特定问题。 我知道我可以使用,myField = 'someValue' AND NOT myField IS NULL并且得到一个“可逆”表达式,它永远不会产生未知: SELECT * …

1
为什么我的索引查找可以估计正确的行数而排序运算符不能呢?
我有一个查询,该查询在谓词上使用函数,如下所示: commentType = 'EL' AND commentDateTime >= DATEADD(month,datediff(month,0,getdate()) - 13,0) 我在commentType上有一个经过筛选的索引,该索引具有40K行,当我运行查询时,Index Seek的估计行数非常准确(大约11K),但是对于下一步(sort运算符),它完全忽略了统计信息,仅估算过滤索引中的总行数。 为什么会这样呢?我知道有关可保留性的基础知识,并且为了安全起见,我已经进行了测试,以实际日期(2014-01-01)替换dateadd和voila ...排序开始正确地猜测行数... 为什么会发生这种情况,我该如何解决?我无法通过固定日期...

1
如何导出sp_AskBrent的输出?
我们有一个随机增加CPU峰值的实例。我想创建一个警报,该警报在CPU上触发超过90%的警报,并自动调用运行的作业sp_AskBrent并通过电子邮件将输出发送给我。但是,该输出在“文本”或HTML输出中均不可读。它甚至不能很好地放入Excel电子表格中。如何获取可读格式的信息?

2
有理由使用SELECT…WITH XLOCK?
我面临着一些反复出现的死锁,其中之一是键锁,并且包含带有XLOCK提示的SELECT查询,该查询成为了死锁的受害者。另一个语句是对其中一个表的INSERT,该表是第一个查询的视图的一部分。 视图: create view dbo.viewE as select * from dbo.E where myValue > 13000 选择查询: select * from dbo.viewE with (XLOCK) where A > GETUTCDATE() INSERT语句: INSERT INTO [dbo].[E] (myValue,A) VALUES (10,GetDate()) 基础表dbo.E在大约20列中拥有约300万行,其中有些是ntext。 取出查询并使用两个事务手动进行模拟,该行为是可重现的。如果从选择中删除了XLOCK,则行为会更改。 死锁图: <deadlock-list> <deadlock victim="process222222221"> <process-list> <process id="process222222221" taskpriority="0" logused="0" waitresource="KEY: 5:72057604035644444 (ccdf51accc0c)" waittime="2522" ownerId="27202256401" transactionname="SELECT" lasttranstarted="2015-09-14T16:32:36.160" …

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.