标签: optimization

优化位图堆扫描

我试图理解为什么我的查询需要很长时间,即使我已经索引了所需的列:

SELECT entity_id,
       id,
       report_date
FROM own_inst_detail
WHERE ( own_inst_detail.id = 'P7M7WC-S' )
  AND ( own_inst_detail.report_date >= '2017-02-01T17:29:49.661Z' )
  AND ( own_inst_detail.report_date <= '2018-08-01T17:29:49.663Z' )
Run Code Online (Sandbox Code Playgroud)

缓存结果EXPLAIN ANALYZE如下:

Bitmap Heap Scan on own_inst_detail (cost=20.18..2353.55 rows=597 width=22) (actual time=1.471..6.955 rows=4227 loops=1)
  Recheck Cond: ((id = 'P7M7WC-S'::bpchar) AND (report_date >= '2017-06-01'::date) AND (report_date <= '2018-08-01'::date))
  Heap Blocks: exact=4182
  ->  Bitmap Index Scan on own_inst_detail  (cost=0.00..20.03 rows=597 width=0) (actual time=0.901..0.901 rows=4227 loops=1)
        Index Cond: ((id = 'P7M7WC-S'::bpchar) AND (report_date >= '2017-06-01'::date) AND …
Run Code Online (Sandbox Code Playgroud)

postgresql performance optimization query-performance postgresql-performance

6
推荐指数
1
解决办法
9102
查看次数

SQL Server优化过程揭秘

我们希望看到 SQL Server 优化器在查询优化期间考虑的查询计划的所有变体。SQL Server 使用querytraceon选项提供了非常详细的洞察力。例如,QUERYTRACEON 3604, QUERYTRACEON 8615允许我们打印出 MEMO 结构并QUERYTRACEON 3604, QUERYTRACEON 8619打印出在优化过程中应用的转换规则列表。这很好,但是,我们在跟踪输出方面有几个问题:

  1. 似乎 MEMO 结构只包含查询计划的最终变体或后来被重写为最终变体的变体。有没有办法找到“不成功/没有希望”的查询计划?
  2. MEMO 中的运算符不包含对 SQL 部分的引用。例如,LogOp_Get 运算符不包含对特定表的引用。
  3. 转换规则不包含对 MEMO 运算符的精确引用,因此,我们无法确定转换规则转换了哪些运算符。

让我用一个更详细的例子来展示它。让我有两个人造表AB

WITH x AS (
        SELECT n FROM
        (
            VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)
        ) v(n)
    ),
    t1 AS
    (
        SELECT ones.n + 10 * tens.n + 100 * hundreds.n + 1000 * thousands.n + 10000 * tenthousands.n + …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization

6
推荐指数
1
解决办法
279
查看次数

实际执行计划中未使用索引视图?

我有一个索引视图的适度用例,它折叠一列并总结一个大表中的所有条目:

CREATE VIEW dbo.Losses_CombinedPortfolio WITH SCHEMABINDING
AS
    SELECT [Category], [Year], 
           SUM(ISNULL(Loss,0)) AS [Loss], COUNT_BIG(*) as [Count]
    FROM dbo.Sub_Portfolio_Losses
    GROUP BY [Category], [Year]
GO
CREATE UNIQUE CLUSTERED INDEX Idx
ON dbo.Losses_CombinedPortfolio([Category], [Year]);
Run Code Online (Sandbox Code Playgroud)

我最初的目标更加雄心勃勃,但索引视图的限制如此之多......我很高兴能够让它发挥作用。

可悲的是,当我尝试对此索引视图进行基本查询时:

SELECT TOP (100) * 
FROM Losses_CombinedPortfolio 
ORDER BY Loss DESC
Run Code Online (Sandbox Code Playgroud)

...查询也很慢,实际执行计划表明它总是回到源表并每次从头开始计算聚合:

实际执行计划

我只能假设这是因为我计算出的“损失”列没有被具体化 - 但这会让我感到惊讶,因为聚集索引创建成功。


请注意,此视图的主要用例是按Loss降序排序,但我无法明确创建包含它的索引:

CREATE UNIQUE CLUSTERED INDEX Idx 
ON dbo.Losses_CombinedPortfolio
    (Category, Loss DESC, [Year]);
Run Code Online (Sandbox Code Playgroud)

我收到错误:

无法在视图 'dbo.Losses_CombinedPortfolio' 上创建索引或统计信息 'Idx',因为关键列 'Loss' 是不精确的、已计算的且未持久化。考虑删除对视图索引或统计键中的列的引用或更改列以使其精确。如果在基表中计算列,请考虑在那里将其标记为 PERSISTED。

我尝试通过将总损失转换为除float(甚至尝试将其截断为bigint)以外的类型来解决“不精确”,但似乎此错误源于用于计算总和的基础类型。

我很困惑 - 我看到其他问题声称他们能够成功地执行聚合,例如sum …

sql-server optimization materialized-view sql-server-2016

6
推荐指数
1
解决办法
227
查看次数

是否有更优化的方法来创建此视图或存储过程?目前使用交叉应用,但速度很慢

我用一些测试数据更新了这篇文章。

我正在为我的电影数据库创建一个报告,我希望最终用户能够选择某种类型的电影。然而,有些电影有多种类型,我已经规范化了数据库,以便具有多个类型的电影订单项变成多个订单项,每个订单项都指向相应的类型/类型 ID。(对于董事也做了类似的事情)。

标准化前

电影 类型
弗兰肯斯坦的新娘 恐怖、剧情

标准化后

电影 类型
弗兰肯斯坦的新娘 恐怖
弗兰肯斯坦的新娘 戏剧

我遇到的问题是,为了这份报告,我希望做到这样,如果电影有多种类型,那么它们就不会在报告中重复。相反,电影标题成为一个行项目,并且流派字段被连接起来以显示一行内的所有流派(类似于标准化之前的视图)。我最终要做的是创建一个视图,在其中按照与电影 ID 匹配的类型交叉应用电影选择的输出。我觉得我有点过于复杂了,而且我的商店程序运行得相当慢,因为我还有其他几个字段允许用户进行过滤。

下面是交叉应用视图。

ALTER VIEW [dbo].[vwMoviesJoinedGenres] AS

WITH genreMovies_CTE AS (
SELECT M.MovieID
    , M.MovieTitle
    , G.GenreName
    , G.GenreID
    , M.TitleTypeID
    , TT.TitleType
    , M.MediaID
    , M.IMDBLink
    , M.IMDBRating
    , M.ReleaseDate
    , M.Runtime
    , M.ImageURL
    , M.MovieYear
FROM [dbo].[Movies] AS M
INNER JOIN GenresMovies AS GM
    ON GM.MovieID = M.MovieID
INNER JOIN Genres AS G
    ON G.GenreID = GM.GenreID
INNER JOIN TitleType AS TT …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures optimization t-sql cross-apply

6
推荐指数
1
解决办法
437
查看次数

获取前 9 条记录并再创建一条记录,在 MySQL 中将作为“其他”

我正在从一个表中获取记录,其中一个字段计数,另一个字段作为名称。我只想要 10 条记录。其中 9 条记录给了我字段及其计数。但我想将 10 条记录显示为“其他”,所有剩余字段都带有计数。这有点像包装记录。下面是表格内容。

emp_id | designation

 1   |   software Engg.

 2   |   software Engg.

 3   |   Project Manager
Run Code Online (Sandbox Code Playgroud)

不少于10个指定。

And I want to show first 10 records as
Software Engineers  20
Project Manager     5
....
....
....
Others    50
Run Code Online (Sandbox Code Playgroud)

有什么方法可以为 mysql db 进行 SQL 查询,以便在我为“其他”添加记录计数的应用程序级别快速并节省时间?

请建议我如何以有效的方式使其成为可能。

mysql stored-procedures optimization

5
推荐指数
1
解决办法
2491
查看次数

SQL Server 无通配符 LIKE 优化

在使用 SQL Server 2008 R2 作为后端的 Web 应用程序中,我有几个字段,如果存在,将 WHERE 子句添加到查询中。

如果我将所有查询生成为 like 子句,例如:

AND Uri LIKE @Uri

如果Uri包含 no %,优化器是否足够聪明以将其视为WHERE Uri = @Uri或我必须处理该应用程序端?

我意识到优化器总有一天会从我手下变出来,这有点草率,但我仍然很好奇。

示例计划

我做了一个一次性测试,似乎表明>= ... <=条件可能是这种情况:

在此处输入图片说明

对比 凡条款:

在此处输入图片说明

因此,它们都在该人为索引上触发索引搜索。是>= ... <==在这种情况下,并且将这个总是发生?

sql-server-2008 sql-server optimization

5
推荐指数
1
解决办法
2083
查看次数

为大型(?)WordPress 数据库加速 SQL 查询?

我正在使用一个名为feedwordpress的 WordPress 插件,以便在WordPress上运行一个类似网站的星球(它从其他网站获取内容,并获得他们的许可)(在此处查看)。

该插件很棒,除了一件事 - 它每周左右让我的(VPS)服务器提交一次。

在最近与网络管理员的电子邮件交流中,他写道:

看起来 mysql 资源使用量的增加确实是由 r-bloggers.com 运行的慢查询引起的。这是正在生成的一些日志的副本。您需要进一步优化此站点和数据库,以使其尽可能高效地运行。如果已经进行了这些更改,您最好的选择是考虑对您的 VPS 进行大规模升级,因为您的站点需要和看到的高级别或资源和流量。

以下是日志:

# Time: 110614 16:11:35
# User@Host: rblogger_rblogr[rblogger_rblogr] @ localhost []
# Query_time: 104 Lock_time: 0 Rows_sent: 0 Rows_examined: 54616
SELECT SQL_CALC_FOUND_ROWS wp_rb_posts.* 
  FROM wp_rb_posts 
  WHERE 1=1 AND (
   (guid = '235cbefa4424d0cdb7b6213f15a95ded') OR 
   (guid = 'http://www.r-bloggers.com/?guid=235cbefa4424d0cdb7b6213f15a95ded') OR 
   (guid = 'http://www.r-bloggers.com/?guid=235cbefa4424d0cdb7b6213f15a95ded') OR 
   (MD5(guid) = '235cbefa4424d0cdb7b6213f15a95ded') ) AND 
  wp_rb_posts.post_type IN 
      ('post', 'page', 'attachment', 'revision', 'nav_menu_item') AND 
  (wp_rb_posts.post_status = 'publish' OR 
   wp_rb_posts.post_status = 'future' OR …
Run Code Online (Sandbox Code Playgroud)

mysql optimization

5
推荐指数
1
解决办法
809
查看次数

my.cnf 值不适用 - 在 CentOS LAMP 中优化 MySQL

我检查了 my.cnf 的其他出现,但我只发现了 /etc/my.cnf 出现了一次。

然后,我继续修复我的值,例如 query_cache_size 等。

保存并重新启动后,未应用 my.cnf 中的值。我正在使用 CentOS 5.6、Apache 2 上的 LAMP、MySQL 5.0.77

有什么帮助吗?

我也跑了

[root@veepiz ~]# ps aux | grep mysql
root     16202  0.0  0.1  61220   704 pts/0    D+   03:17   0:00 grep mysql
root     32054  0.0  0.1  63888   536 ?        S    Jul24   0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --user=mysql
mysql    32096  6.0  1.6 250592  8352 ?        Sl   Jul24  19:14 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --port=3306 --socket=/var/lib/mysql/mysql.sock
Run Code Online (Sandbox Code Playgroud)

这是/etc/init.d/mysqld的内容

#!/bin/bash
#
# mysqld    This shell …
Run Code Online (Sandbox Code Playgroud)

mysql optimization configuration

5
推荐指数
1
解决办法
3028
查看次数

MySQL 查询优化:索引和分页

我正在将分页添加到我的“最新消息”php 脚本中,但遇到了一个问题。

SELECT sid, title, time, bodytext, author, url FROM news WHERE approved=1 ORDER BY time desc LIMIT $start, $limit
Run Code Online (Sandbox Code Playgroud)

我在批准的时间列上有索引。

问题是当我对查询执行 EXPLAIN 时,它显示它正在使用“已批准”索引 - 但它仍然必须扫描所有 1000 行才能获得我想要显示的 10 个新条目。

无论如何要优化查询,以免发生这种情况?

mysql optimization order-by

5
推荐指数
2
解决办法
2912
查看次数

SQL Server 是否优化或预解析存储过程?

尽管 DBA 会告诉您什么(“使用存储过程,因为服务器会优化它们,因此它们比临时查询更快”),但我听说 SQL Server 实际上并没有优化存储过程。

那么,SQL Server 是否优化了存储过程?它甚至事先解析它们,还是只是将它们作为 sql 脚本存储在内部?

我没有询问特定的 SQL Server 版本,因为我认为历史与有意义的理解有关。


请注意,我的问题不是,“即席查询是否与存储过程一样快?” 回答这个问题涉及太多其他因素。

sql-server stored-procedures optimization

5
推荐指数
2
解决办法
1111
查看次数