以这个为例:
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 。
我已经在不同的在线论坛上搜索过,但对此我还没有得到任何明确的答案。
问题是我有一个查询,它的 CPU 时间比 Elapsed 时间大 4 倍。我还有一个查询,其中 Elapsed time 大于 CPU 时间。我不明白为什么会这样。您能否解释一下,这两种情况下实际发生了什么?
一个例子是我的查询有 4000 毫秒的 CPU 时间,而经过的时间只有 1000 毫秒,而一个查询的经过时间是 2 毫秒,而 CPU 时间是 0 毫秒。
根据以下帖子:
更高的 CPU 时间和更低的运行时间是由于 SQL 服务器的超线程或多核利用率,但我无法找到任何相关的真实信息。另一个混淆是相反的情况。例如,当 CPU 时间为 0ms 时,经过的时间怎么可能是 4ms?
对此的任何详细答案将不胜感激。
我一直在思考重新启动服务后执行计划在 SQL SERVER 中的行为。我知道在缓存内存中的每个查询执行中都存在一个过程来解析、编译和优化请求的查询,应用基于 SQL 中的统计信息和其他参数的执行计划。所有这些执行计划都存储在存储引擎的缓冲池区域中。实际上,每次执行后,这些计划都会更新,让 SQL SEVER 了解新的改进。
这是我的疑问:每次我决定重新启动 SQL 服务时,缓存中的执行计划会发生什么?缓冲池区域中的所有改进都被存储并重新加载以在新的执行中可用?所有执行计划都在重新启动之前重新加载为最新版本,或者相反,SQL 需要创建新的执行计划库以继续改进执行?
拜托,伙计们,如果你能解释这种行为,我将非常感激。非常感谢
你有没有解释一下,为什么查询优化器在这个例子中选择了不同的索引和模式?
/* 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 中的执行计划,我试图了解 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 …
有一个类似的问题,但不一样:
我有以下查询和以下过滤索引,但我看不出该查询无法使用下面描述的过滤索引的任何原因:
- 查询 - 使用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
我在 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
我正在研究一个场景,在这个场景中,我提供了一个变量值。当我传递 Null 值时,查询引擎没有扫描连接表。根据逻辑查询处理,首先执行FROM子句,然后执行ON和JOIN。但在这种情况下,查询引擎直接转到Where子句。当变量的值为 NULL 时,任何人都可以解释行为查询引擎。我正在使用 SQL Server 2016。
当值改变时
performance sql-server optimization execution-plan sql-server-2016 query-performance
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) 我有一张超过 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)