相当简单的问题,可能在某处得到了回答,但我似乎无法为 Google 形成正确的搜索问题......
在查询该表的子集时,特定表中的列数是否会影响查询的性能?
例如,如果表 Foo 有 20 列,但我的查询只选择了其中的 5 列,那么有 20(而不是 10)列会影响查询性能吗?为简单起见,假设 WHERE 子句中的任何内容都包含在这 5 列中。
除了操作系统的磁盘缓存之外,我还担心 Postgres 的缓冲区缓存的使用。我对 Postgres 的物理存储设计一无所知。表存储在多个页面上(默认为每页 8k 大小),但我不太明白元组是如何从那里排列的。PG 是否足够聪明,只能从磁盘中获取包含这 5 列的数据?
在诊断基数估计不佳的 SQL Server 2008 R2 查询(尽管有简单的索引、最新的统计数据等)和查询计划不佳时,我发现了一篇可能相关的知识库文章: FIX:运行查询时性能不佳包含 SQL Server 2008 或 SQL Server 2008 R2 或 SQL Server 2012 中的关联 AND 谓词
我可以猜测知识库文章中“相关”的含义,例如谓词#2 和谓词#1 主要针对相同的行。
但我不知道 SQL Server 是如何知道这些相关性的。表是否需要包含来自两个谓词的列的多列索引?SQL 是否使用统计信息来检查一列中的值是否与另一列相关?还是使用了其他方法?
我问这个有两个原因:
performance sql-server statistics sql-server-2008-r2 query-performance
SentryOne Plan Explorer是否像宣传的那样工作,是否合法?有什么问题或需要担心的事情吗?
与 SSMS 对估计执行计划视图的噩梦相比,它似乎以颜色显示了热路径。
我担心的是 - 它是否恶意或以其他方式修改任何数据?
编辑:我刚刚听说过它,以前从未听说过这家公司。
performance sql-server optimization execution-plan query-performance
我有一个复杂的查询,它在查询窗口中运行 2 秒,但作为存储过程运行大约 5 分钟。为什么作为存储过程运行需要这么长时间?
这是我的查询的样子。
它需要一组特定的记录(由@id和标识@createdDate)和特定的时间范围(从 开始的 1 年@startDate),并返回发送的信件的汇总列表以及由于这些信件而收到的估计付款。
CREATE PROCEDURE MyStoredProcedure
@id int,
@createdDate varchar(20),
@startDate varchar(20)
AS
SET NOCOUNT ON
-- Get the number of records * .7
-- Only want to return records containing letters that were sent on 70% or more of the records
DECLARE @limit int
SET @limit = IsNull((SELECT Count(*) FROM RecordsTable WITH (NOLOCK) WHERE ForeignKeyId = @id AND Created = @createdDate), 0) * .07
SELECT DateSent …Run Code Online (Sandbox Code Playgroud) performance sql-server-2005 stored-procedures query-performance
在维护工作期间,我试图获取碎片索引的列表。但查询速度极慢,执行时间超过 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
Run Code Online (Sandbox Code Playgroud)
我不是 DBA,可能在上面的查询中犯了一个明显的错误,或者可能有一些索引或统计信息会有所帮助?也许这只是数据库的大小(大约 20Gb,大约有 140 个表)。
我问的原因是我们只有一个非常小的夜间维护窗口,而这占用了大部分时间。
performance index sql-server maintenance dmv query-performance
我用查询来计算记录
SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%something%'
SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%another%'
SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%word%'
Run Code Online (Sandbox Code Playgroud)
对于每一个计数,mysql都需要遍历整个表,如果表很长,查询很多,这是一个大问题。
我想知道是否有一种方法可以在一个查询中进行所有计数。在这种情况下,当mysql遍历每一行时,它会处理所有计数,而无需一遍又一遍地扫描整个表。
我有以下 SQL 查询:
SELECT
Event.ID,
Event.IATA,
Device.Name,
EventType.Description,
Event.Data1,
Event.Data2
Event.PLCTimeStamp,
Event.EventTypeID
FROM
Event
INNER JOIN EventType ON EventType.ID = Event.EventTypeID
INNER JOIN Device ON Device.ID = Event.DeviceID
WHERE
Event.EventTypeID IN (3, 30, 40, 41, 42, 46, 49, 50)
AND Event.PLCTimeStamp BETWEEN '2011-01-28' AND '2011-01-29'
AND Event.IATA LIKE '%0005836217%'
ORDER BY Event.ID;
Run Code Online (Sandbox Code Playgroud)
我在Event表上也有一个列的索引TimeStamp。我的理解是这个索引没有使用,因为IN()声明。所以我的问题是有没有办法为这个特定的IN()语句建立索引来加速这个查询?
我还尝试将 上Event.EventTypeID IN (2, 5, 7, 8, 9, 14)的索引添加为过滤器TimeStamp,但是在查看执行计划时,它似乎没有使用此索引。对此的任何建议或见解将不胜感激。
下面是图形化计划:

performance sql-server-2008-r2 filtered-index query-performance
在一些 SQL Server 开发人员中,普遍认为NOT IN速度非常慢,应该重写查询,以便它们返回相同的结果,但不要使用“evil”关键字。(示例)。
这有什么道理吗?
例如,SQL Server 中是否存在一些已知错误(哪个版本?)导致使用NOT IN的查询比使用的等效查询具有更差的执行计划
LEFT JOIN结合了NULL支票或(SELECT COUNT(*) ...) = 0在WHERE条款中?我正在比较 SQL Server 2012 中的两个查询。目标是在选择最佳查询时使用查询优化器提供的所有相关信息。两个查询产生相同的结果;所有客户的最大 orderid。
在使用 FREEPROCCACHE 和 DROPCLEANBUFFERS 执行每个查询之前清除缓冲池
使用下面提供的信息,哪个查询是更好的选择?
-- Query 1 - return the maximum order id for a customer
SELECT orderid, custid
FROM Sales.Orders AS O1
WHERE orderid = (SELECT MAX(O2.orderid)
FROM Sales.Orders AS O2
WHERE O2.custid = O1.custid);
-- Query 2 - return the maximum order id for a customer
SELECT MAX(orderid), custid
FROM Sales.Orders AS O1
group by custid
order by custid
Run Code Online (Sandbox Code Playgroud)
统计时间
查询 1 STATISTICS TIME:CPU 时间 = 0 毫秒,经过时间 …
我正在处理的数据处理系统存在一些性能问题。我从一小时的 peroid 中收集了等待统计数据,其中显示了大量的 CXPACKET 和 LATCH_EX 等待事件。
该系统由 3 个处理 SQL Server 组成,它们进行大量的数字运算和计算,然后将数据馈送到中央集群服务器。处理服务器最多可以同时运行 6 个作业。这些等待统计数据适用于我认为导致瓶颈的中央集群。中央集群服务器有 16 个内核和 64GB RAM。MAXDOP 设置为 0。
我猜 CXPACKET 来自正在运行的多个并行查询,但是我不确定 LATCH_EX 等待事件表示什么。从我读到的这可能是一个非缓冲等待?
任何人都可以建议这种等待统计的原因是什么,以及我应该采取什么行动来调查这个性能问题的根本原因?
顶部查询结果是总等待统计数据,底部查询结果是 1 小时内的统计数据

performance sql-server parallelism wait-types query-performance
performance ×10
sql-server ×5
count ×1
dmv ×1
except ×1
index ×1
maintenance ×1
mysql ×1
optimization ×1
parallelism ×1
postgresql ×1
query ×1
statistics ×1
wait-types ×1