这是另一个查询优化器难题。 也许我只是高估了查询优化器,或者我错过了一些东西,所以我把它放在了那儿。 我有一张简单的桌子 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' …
在具有足够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 …
我遇到了一个问题,就是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 …
我有一个超过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子句中使用了低选择性列。 该表没有聚簇索引。
例 我有桌子 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 * …