标签: optimization

如果其他 where 子句返回足够多的结果,SQL Server 能否避免子查询或连接?

以这个为例:

SELECT TOP 1 FROM customers
WHERE firstname LIKE 'John%'
   OR id IN (SELECT id_customer 
             FROM customer_emails 
             WHERE email like 'john.doe@%' )
Run Code Online (Sandbox Code Playgroud)

查询优化器是否设法优先处理第一个子句,如果更简单的子句对于至少 1 条记录(使用 Top 1)为真,则避免执行子查询?

我问这个主要是因为上面的查询可以重写为 Join,根据Join vs. sub-query从技术上讲,它会更快。但是,如果避免使用子查询,则在第一个子句可能为真的情况下,上面的示例显然优于 Join 。

sql-server optimization

4
推荐指数
1
解决办法
1767
查看次数

关于 CPU 时间和经过时间计算的混淆

我已经在不同的在线论坛上搜索过,但对此我还没有得到任何明确的答案。

问题是我有一个查询,它的 CPU 时间比 Elapsed 时间大 4 倍。我还有一个查询,其中 Elapsed time 大于 CPU 时间。我不明白为什么会这样。您能否解释一下,这两种情况下实际发生了什么?

一个例子是我的查询有 4000 毫秒的 CPU 时间,而经过的时间只有 1000 毫秒,而一个查询的经过时间是 2 毫秒,而 CPU 时间是 0 毫秒。

根据以下帖子:

/sf/ask/449351871/

更高的 CPU 时间和更低的运行时间是由于 SQL 服务器的超线程或多核利用率,但我无法找到任何相关的真实信息。另一个混淆是相反的情况。例如,当 CPU 时间为 0ms 时,经过的时间怎么可能是 4ms?

对此的任何详细答案将不胜感激。

performance sql-server optimization query-performance

4
推荐指数
1
解决办法
1万
查看次数

在 SQL Server 中重新启动后的执行计划行为

我一直在思考重新启动服务后执行计划在 SQL SERVER 中的行为。我知道在缓存内存中的每个查询执行中都存在一个过程来解析、编译和优化请求的查询,应用基于 SQL 中的统计信息和其他参数的执行计划。所有这些执行计划都存储在存储引擎的缓冲池区域中。实际上,每次执行后,这些计划都会更新,让 SQL SEVER 了解新的改进。

这是我的疑问:每次我决定重新启动 SQL 服务时,缓存中的执行计划会发生什么?缓冲池区域中的所有改进都被存储并重新加载以在新的执行中可用?所有执行计划都在重新启动之前重新加载为最新版本,或者相反,SQL 需要创建新的执行计划库以继续改进执行?

拜托,伙计们,如果你能解释这种行为,我将非常感激。非常感谢

performance sql-server optimization query-performance

4
推荐指数
1
解决办法
1739
查看次数

神秘的条件 where 子句索引选择

你有没有解释一下,为什么查询优化器在这个例子中选择了不同的索引和模式?

/* crete objects and data for testing */

-- table
CREATE TABLE #Test (
    ID INT IDENTITY PRIMARY KEY
    ,CustNo INT NULL
    ,CustNo2 INT NULL
    );

-- populate with data
WITH
  L0   AS(SELECT 1 AS c UNION ALL SELECT 1),
  L1   AS(SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B),
  L2   AS(SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B),
  L3   AS(SELECT 1 AS c FROM L2 AS A CROSS JOIN …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization t-sql execution-plan

4
推荐指数
1
解决办法
108
查看次数

理解执行计划的问题

我不熟悉 SQL Server 中的执行计划,我试图了解 SQL Server 执行某些操作的原因。查询是:

select P.PERSONID
from KSS_V_EMPLEADOS_PER_3_CERRADOS p, COMBHOMEACCT c, LABORACCT L, kss_carga_empl_centros k, CALENDAR ca
where p.PERSONID = c.EMPLOYEEID
and c.LABORACCTID = l.LABORACCTID
and k.empleado = p.PERSONNUM
and convert(date,ca.CALENDARDTM,103) between DBO.KSS_PrimerDiaMes(convert(DATE,@DFECHA, 103)) and DBO.KSS_UltimoDiaMes(convert (DATE,@DFECHA, 103))
and convert(date,ca.CALENDARDTM,103) between p.Inicio and p.Fin
and convert(date,ca.CALENDARDTM,103) between convert(date,c.EFFECTIVEDTM,103) and convert(date,c.EXPIRATIONDTM-1,103)
and convert(date,ca.CALENDARDTM,103) between k.FECHA_INI and k.FECHA_FIN
and l.LABORLEV4NM <> k.CENTRO
Run Code Online (Sandbox Code Playgroud)

表信息

  • KSS_V_EMPLEADOS_PER_3_CERRADOS是一个没有索引的视图,涉及一些表和函数。它有 12827 行

  • COMBHOMEACCT c 是一个有 16771 行的表

  • LABORACCT 是一个有 2460 行的表

  • kss_carga_empl_centros 是一个有 6594 …

sql-server optimization execution-plan

4
推荐指数
1
解决办法
175
查看次数

由于此查询中定义的提示,查询处理器无法生成查询计划

有一个类似的问题,但不一样:

查询处理器无法生成查询计划

我有以下查询和以下过滤索引,但我看不出该查询无法使用下面描述的过滤索引的任何原因:

- 查询 - 使用max列或仅使用列都没有关系,它不喜欢索引提示

SELECT -- MAX(AC1.changeDate)   
          AC1.changeDate
          FROM [dbo].[applicationStateChange]  AS ac1  WITH(INDEX(FI_ASC_ChangeDate))  
          WHERE ac1.applicationID = 130002
          AND AC1.newStatus = 'PLC'  
Run Code Online (Sandbox Code Playgroud)

-- 这是我的过滤索引 - 这个索引只是为了优化上面的查询

CREATE NONCLUSTERED INDEX FI_ASC_ChangeDate  
ON [dbo].[applicationStateChange] (   applicationID DESC)  
INCLUDE ( [changeDate] )
WHERE newStatus = 'PLC'  
WITH (  PAD_INDEX = OFF, FILLFACTOR = 100  , SORT_IN_TEMPDB = OFF , IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF, ONLINE = On, 
DROP_EXISTING = ON, 
DATA_COMPRESSION=PAGE, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON ) …
Run Code Online (Sandbox Code Playgroud)

index optimization execution-plan filtered-index sql-server-2016

4
推荐指数
1
解决办法
1万
查看次数

Postgres 不够聪明,无法结合 WHERE 和 ORDER BY 中的字段进行索引扫描?

我在 Postgres 9.6 中有下表:

                                       Table "public.TagNotifications"
    Column    |            Type             |                            Modifiers                            
--------------+-----------------------------+-----------------------------------------------------------------
 createdAt    | timestamp with time zone    | not null default now()
 updatedAt    | timestamp with time zone    | not null default now()
 id           | integer                     | not null default nextval('"TagNotifications_id_seq"'::regclass)
 tag          | character varying(255)      | not null
 triggerId    | integer                     | 
 userId       | integer                     | not null
 comparison   | "TagNotificationComparison" | 
 setpoint     | double precision            | 
 severity     | "TagNotificationSeverity"   | 
 acknowledged | boolean                     | not null default false …
Run Code Online (Sandbox Code Playgroud)

postgresql performance optimization order-by query-performance

4
推荐指数
1
解决办法
66
查看次数

当常量变量为 Null 时,执行计划不同

我正在研究一个场景,在这个场景中,我提供了一个变量值。当我传递 Null 值时,查询引擎没有扫描连接表。根据逻辑查询处理,首先执行FROM子句,然后执行ONJOIN。但在这种情况下,查询引擎直接转到Where子句。当变量的值为 NULL 时,任何人都可以解释行为查询引擎。我正在使用 SQL Server 2016。

在此处输入图片说明

当值改变时

在此处输入图片说明

performance sql-server optimization execution-plan sql-server-2016 query-performance

4
推荐指数
1
解决办法
269
查看次数

OPTIMIZE FOR variable error

I'm having a problem specifying a value within an OPTIMIZE FOR statement. I'd like to optimize the query with the value as a string, but I must be doing something wrong, because SQL gives the following error:

在 OPTIMIZE FOR 子句中为变量“@test”指定的值无法隐式转换为该变量的类型。

下面的示例有点人为,但问题与我在实际查询中遇到的问题相同。

declare @TEMP table(asWord nvarchar(max), asNumber int)

insert into @TEMP (asWord, asNumber) values (
    'one',
    1
), (
    'two',
    2
)

DECLARE @test nvarchar(max)
SET @test = 'one'

select * from @TEMP
where asWord = @test
OPTION (OPTIMIZE FOR(@test …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization

4
推荐指数
1
解决办法
199
查看次数

如何优化索引列上的 IN 查询

我有一张超过 5000 万条记录的表。其中一个字段是COLOR_CODE。我在列上设置了一个索引,COLOR_CODE如下所示:

"mytable_colorcode_idx" btree (color_code)
Run Code Online (Sandbox Code Playgroud)

我注意到当我运行下面的查询时,执行时间更长

SELECT count(total_amount) FROM mytable 
WHERE color_code in ('red','green') and sale_date = '1970'
Run Code Online (Sandbox Code Playgroud)

但是,使用OR子句执行时间更快:

SELECT count(total_amount) FROM mytable 
WHERE color_code = 'red' or color_code = 'green' and sale_date = '1970'
Run Code Online (Sandbox Code Playgroud)

查询计划 IN

explain analyze SELECT count(total_amount) FROM mytable 
WHERE color_code in ('red','green') and sale_date = '1970'
                                                                            QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=2074238.07..2074238.08 rows=1 width=8) (actual time=63520.150..63520.150 rows=1 loops=1)
   ->  Bitmap Heap Scan on mytable  (cost=53504.73..2069923.27 rows=1725919 width=6) (actual time=3509.920..63080.519 …
Run Code Online (Sandbox Code Playgroud)

postgresql performance index optimization query-performance

4
推荐指数
1
解决办法
131
查看次数