Questions tagged «query-performance»

有关改善数据库查询的性能和/或效率的问题。

4
为什么我的查询突然比昨天慢?
[薪水] (检查一项) [ ] Well trained professional, [ ] Casual reader, [ ] Hapless wanderer, 我有一个(选中所有适用项) [ ] query [ ] stored procedure [ ] database thing maybe 运行良好(如果适用) [ ] yesterday [ ] in recent memory [ ] at some point 但现在突然变慢了。 我已经检查过以确保它未被阻止,并且它不是某些长期运行的维护任务,报告或其他带外流程的受害者。 有什么问题,我应该怎么做,我可以提供什么信息以获得帮助? [*Insert appropriate closing remarks*]


6
使用窗口功能的日期范围滚动总和
我需要计算日期范围内的滚动总和。为了说明这一点,使用AdventureWorks示例数据库,以下假设语法将完全满足我的需要: SELECT TH.ProductID, TH.TransactionDate, TH.ActualCost, RollingSum45 = SUM(TH.ActualCost) OVER ( PARTITION BY TH.ProductID ORDER BY TH.TransactionDate RANGE BETWEEN INTERVAL 45 DAY PRECEDING AND CURRENT ROW) FROM Production.TransactionHistory AS TH ORDER BY TH.ProductID, TH.TransactionDate, TH.ReferenceOrderID; 可悲的是,RANGE窗口框架范围当前在SQL Server中不允许间隔。 我知道我可以使用子查询和常规(非窗口)聚合来编写解决方案: SELECT TH.ProductID, TH.TransactionDate, TH.ActualCost, RollingSum45 = ( SELECT SUM(TH2.ActualCost) FROM Production.TransactionHistory AS TH2 …

6
如何有效地获取“最近对应的行”?
我有一个必须非常常见的查询模式,但是我不知道如何为它编写有效的查询。我想查找与“最近日期不晚于”另一个表的行相对应的表的行。 例如,我有一张桌子,inventory它代表我当天持有的库存。 date | good | quantity ------------------------------ 2013-08-09 | egg | 5 2013-08-09 | pear | 7 2013-08-02 | egg | 1 2013-08-02 | pear | 2 还有一张表,上面写着“价格”,该表保存了某天的商品价格 date | good | price -------------------------- 2013-08-07 | egg | 120 2013-08-06 | pear | 200 2013-08-01 | egg | 110 …

5
为什么我不使用SQL Server选项“针对临时工作负载进行优化”?
我一直在阅读有关Kimberly Tripp的一些有关SQL Server计划缓存的精彩文章,例如:http : //www.sqlskills.com/blogs/kimberly/plan-cache-and-optimizing-for-adhoc-workloads/ 为什么甚至有“针对临时工作负载进行优化”的选项?这不应该一直都在吗?无论开发人员是否在使用即席SQL,为什么不在每个支持它的实例(SQL 2008+)上都启用此选项,从而减少缓存膨胀?

6
为什么添加TOP 1会显着降低性能?
我有一个相当简单的查询 SELECT TOP 1 dc.DOCUMENT_ID, dc.COPIES, dc.REQUESTOR, dc.D_ID, cj.FILE_NUMBER FROM DOCUMENT_QUEUE dc JOIN CORRESPONDENCE_JOURNAL cj ON dc.DOCUMENT_ID = cj.DOCUMENT_ID WHERE dc.QUEUE_DATE <= GETDATE() AND dc.PRINT_LOCATION = 2 ORDER BY cj.FILE_NUMBER 那给了我可怕的表现(就像从来没有想过要等待它完成一样)。查询计划如下所示: 但是,如果我删除,则会TOP 1得到一个看起来像这样的计划,它会在1-2秒内运行: 在下面更正PK和索引。 该事实TOP 1改变了查询计划并不让我感到吃惊,我只是有点惊讶,这使情况变得更糟了这么多。 注意:我已经阅读了这篇文章的结果,并了解了Row Goaletc 的概念。我很好奇的是如何去改变查询,以便它使用更好的计划。目前,我正在将数据转储到临时表中,然后从中提取第一行。我想知道是否有更好的方法。 编辑对于在事实结束后仍在阅读本文的人,这里还有一些其他信息。 Document_Queue-PK / CI是D_ID,它具有约5k行。 Correspondence_Journal-PK / CI为FILE_NUMBER,CORRESPONDENCE_ID,具有约140万行。 当我开始时,没有其他索引。我最后在Correspondence_Journal(Document_Id,File_Number)上写了一个

3
UAT和PROD服务器上执行计划的差异
我想了解为什么在UAT(运行3秒)与PROD(运行23秒)中执行相同查询会有如此大的差异。 UAT和PROD都具有准确的数据和索引。 查询: set statistics io on; set statistics time on; SELECT CONF_NO, 'DE', 'Duplicate Email Address ''' + RTRIM(EMAIL_ADDRESS) + ''' in Maintenance', CONF_TARGET_NO FROM CONF_TARGET ct WHERE CONF_NO = 161 AND LEFT(INTERNET_USER_ID, 6) != 'ICONF-' AND ( ( REGISTRATION_TYPE = 'I' AND (SELECT COUNT(1) FROM PORTFOLIO WHERE EMAIL_ADDRESS …

2
在Postgres 9.2上增加work_mem和shared_buffers会大大减慢查询速度
我有一个运行在具有16GB RAM的8核RHEL 6.3计算机上的PostgreSQL 9.2实例。服务器专用于此数据库。鉴于默认的postgresql.conf在内存设置方面相当保守,我认为允许Postgres使用更多内存可能是一个好主意。令我惊讶的是,遵循wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server上的建议,实际上使我运行的每个查询速度显着降低,但是在更复杂的查询上显然更明显。 我还尝试运行pgtune,它给出了以下建议,并带有更多已调整的参数,但没有任何改变。它建议使用RAM大小的1/4的shared_buffers,这似乎与其他地方(尤其是PG Wiki)上的建议相符。 default_statistics_target = 50 maintenance_work_mem = 960MB constraint_exclusion = on checkpoint_completion_target = 0.9 effective_cache_size = 11GB work_mem = 96MB wal_buffers = 8MB checkpoint_segments = 16 shared_buffers = 3840MB max_connections = 80 我尝试在更改设置(使用reindex database)后为整个数据库重新编制索引,但这也无济于事。我玩过shared_buffers和work_mem。从非常保守的默认值(128k / 1MB)逐渐更改它们会逐渐降低性能。 我遇到EXPLAIN (ANALYZE,BUFFERS)了一些疑问,罪魁祸首似乎是哈希联接的速度明显慢。我不清楚为什么。 举一些具体的例子,我有以下查询。在默认配置下,它在〜2100ms内运行,在配置增加缓冲区的情况下,在〜3300ms内运行: select count(*) from contest c left outer …

2
配置PostgreSQL以获得读取性能
我们的系统写入大量数据(类似于大数据系统)。写入性能足以满足我们的需求,但读取性能确实太慢。 我们所有表的主键(约束)结构相似: timestamp(Timestamp) ; index(smallint) ; key(integer). 一个表可以具有数百万行,甚至数十亿行,并且读取请求通常针对特定时间段(时间戳/索引)和标签。查询返回大约200k行是很常见的。目前,我们每秒可以读取1.5万行,但我们需要提高10倍。这可能吗?如果可以,怎么办? 注意: PostgreSQL与我们的软件打包在一起,因此每个客户端的硬件有所不同。 它是用于测试的VM。VM的主机是Windows Server 2008 R2 x64,具有24.0 GB的RAM。 服务器规格(虚拟机VMWare) Server 2008 R2 x64 2.00 GB of memory Intel Xeon W3520 @ 2.67GHz (2 cores) postgresql.conf 优化 shared_buffers = 512MB (default: 32MB) effective_cache_size = 1024MB (default: 128MB) checkpoint_segment = 32 (default: 3) checkpoint_completion_target …

2
TOP如何(以及为什么)影响执行计划?
对于我要优化的中等复杂查询,我注意到删除该TOP n子句会更改执行计划。我可能已经猜到,当查询中包含TOP n数据库引擎时,该查询将忽略该TOP子句而运行,然后最后仅将结果集缩减为所请求的n行。图形化的执行计划似乎表明是这种情况,这是TOP“最后一步”。但似乎还有更多的事情正在进行。 我的问题是,TOP n子句如何(以及为什么)影响查询的执行计划? 这是我的情况的简化版本: 该查询匹配两个表A和B中的行。 如果没有该TOP子句,优化器估计表A将有19k行,表B将有46k行。对于A,返回的实际行数是16k,对于B,返回的行数是13k。散列匹配用于将两个结果集连接到a总共69行(然后应用排序)。这个查询很快发生。 当我添加TOP 1001优化器时,不使用哈希匹配;相反,它首先对表A的结果进行排序(相同的估计值/实际值为19k / 16k),并针对表B进行嵌套循环。表B的估计行数现在为1,奇怪的是,TOP n直接影响表B 针对B的估计执行次数(索引查找)-始终为2n + 1,在我的情况下为2003。如果我更改,则此估计值也会相应更改TOP n。当然,由于这是嵌套联接,因此实际执行次数为16k(表A中的行数),这会使查询速度变慢。 实际情况要复杂一些,但这捕获了基本思想/行为。使用索引查找来搜索两个表。这是SQL Server 2008 R2企业版。



3
如何加快对2.2亿行的大型表(9 gig数据)的查询?
问题: 我们有一个社交网站,成员可以互相评价兼容性或匹配性。该user_match_ratings表包含超过2.2亿行(9 gig数据或近20 gig索引)。对该表的查询通常显示在slow.log(阈值> 2秒)中,并且是系统中最常记录的慢速查询: Query_time: 3 Lock_time: 0 Rows_sent: 3 Rows_examined: 1051 "select rating, count(*) as tally from user_match_ratings where rated_user_id = 395357 group by rating;" Query_time: 4 Lock_time: 0 Rows_sent: 3 Rows_examined: 1294 "select rating, count(*) as tally from user_match_ratings where rated_user_id = 4182969 group by rating;" Query_time: …

5
没有数据更改的UPDATE性能
如果我有一条UPDATE声明实际上并未更改任何数据(因为数据已经处于更新状态)。在WHERE子句中添加检查以阻止更新是否对性能有好处? 例如,在以下情况下,UPDATE 1和UPDATE 2之间的执行速度是否会有所不同: CREATE TABLE MyTable (ID int PRIMARY KEY, Value int); INSERT INTO MyTable (ID, Value) VALUES (1, 1), (2, 2), (3, 3); -- UPDATE 1 UPDATE MyTable SET Value = 2 WHERE ID = 2 AND Value <> 2; SELECT @@ROWCOUNT; -- UPDATE 2 UPDATE MyTable SET …

1
为什么扫描比寻找该谓词要快?
我能够重现我将其描述为意外的查询性能问题。我正在寻找针对内部的答案。 在我的机器上,以下查询执行聚集索引扫描,并花费大约6.8秒的CPU时间: SELECT ID1, ID2 FROM two_col_key_test WITH (FORCESCAN) WHERE ID1 NOT IN ( N'1', N'2',N'3', N'4', N'5', N'6', N'7', N'8', N'9', N'10', N'11', N'12',N'13', N'14', N'15', N'16', N'17', N'18', N'19', N'20' ) AND (ID1 = N'FILLER TEXT' AND ID2 >= N'' OR (ID1 > N'FILLER TEXT')) ORDER BY ID1, …

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.