我试图理解为什么我的查询需要很长时间,即使我已经索引了所需的列:
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
我们希望看到 SQL Server 优化器在查询优化期间考虑的查询计划的所有变体。SQL Server 使用querytraceon选项提供了非常详细的洞察力。例如,QUERYTRACEON 3604, QUERYTRACEON 8615允许我们打印出 MEMO 结构并QUERYTRACEON 3604, QUERYTRACEON 8619打印出在优化过程中应用的转换规则列表。这很好,但是,我们在跟踪输出方面有几个问题:
让我用一个更详细的例子来展示它。让我有两个人造表A和B:
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) 我有一个索引视图的适度用例,它折叠一列并总结一个大表中的所有条目:
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 …
我用一些测试数据更新了这篇文章。
我正在为我的电影数据库创建一个报告,我希望最终用户能够选择某种类型的电影。然而,有些电影有多种类型,我已经规范化了数据库,以便具有多个类型的电影订单项变成多个订单项,每个订单项都指向相应的类型/类型 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) 我正在从一个表中获取记录,其中一个字段计数,另一个字段作为名称。我只想要 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 查询,以便在我为“其他”添加记录计数的应用程序级别快速并节省时间?
请建议我如何以有效的方式使其成为可能。
在使用 SQL Server 2008 R2 作为后端的 Web 应用程序中,我有几个字段,如果存在,将 WHERE 子句添加到查询中。
如果我将所有查询生成为 like 子句,例如:
AND Uri LIKE @Uri
如果Uri包含 no %,优化器是否足够聪明以将其视为WHERE Uri = @Uri或我必须处理该应用程序端?
我意识到优化器总有一天会从我手下变出来,这有点草率,但我仍然很好奇。
我做了一个一次性测试,似乎表明>= ... <=条件可能是这种情况:

对比 凡条款:

因此,它们都在该人为索引上触发索引搜索。是>= ... <=同=在这种情况下,并且将这个总是发生?
我正在使用一个名为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) 我检查了 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) 我正在将分页添加到我的“最新消息”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 个新条目。
无论如何要优化查询,以免发生这种情况?
尽管 DBA 会告诉您什么(“使用存储过程,因为服务器会优化它们,因此它们比临时查询更快”),但我听说 SQL Server 实际上并没有优化存储过程。
那么,SQL Server 是否优化了存储过程?它甚至事先解析它们,还是只是将它们作为 sql 脚本存储在内部?
我没有询问特定的 SQL Server 版本,因为我认为历史与有意义的理解有关。
请注意,我的问题不是,“即席查询是否与存储过程一样快?” 回答这个问题涉及太多其他因素。
optimization ×10
sql-server ×5
mysql ×4
cross-apply ×1
order-by ×1
performance ×1
postgresql ×1
t-sql ×1