标签: sql-execution-plan

MySQL 查询中 ORDER BY 和 LIMIT 的执行顺序

我有一个这样的查询,我想以分页格式显示排序的记录。

这是我的查询。

SELECT * FROM answers
WHERE userid = '10'
ORDER BY votes LIMIT 10, 20
Run Code Online (Sandbox Code Playgroud)

to 的两个参数LIMIT将用于生成记录的逐页显示。现在,我的问题是ORDER BY。MySQL 如何执行这个查询?

第一种方式

  • 根据过滤器选择记录
  • 对它们进行排序
  • 限制他们

第二种方式

  • 根据过滤器选择记录
  • 限制他们
  • 对它们进行排序

如果我像 MySQL 引擎一样思考,我想实现第二个,因为我将不得不对较少的记录进行排序?

有人可以对此有所了解吗?

问候

mysql sql-order-by limit sql-execution-plan

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

SQL 执行计划是基于 Schema 还是 Data 还是基于两者?

我希望这个问题不是太明显……我已经找到了很多关于解释执行计划的好信息,但有一个问题我还没有找到答案。

计划(更具体地说是相对 CPU 成本)是仅基于模式还是基于数据库中当前的实际数据?

我试图对我的产品数据库中需要索引的位置进行一些分析,但我正在使用我自己的测试系统,该系统没有接近该领域产品所拥有的数据量。我看到一些奇怪的事情,比如在添加索引后估计 CPU 成本实际上略有上升,我想知道这是不是因为我的数据集太小了。

我正在使用 SQL Server 2005 和 Management Studio 来制定计划

sql indexing optimization sql-execution-plan

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

SQLite:ANALYZE 的缺点

ANALYZE 命令有任何缺点吗(除了稍大的数据库)?如果没有,为什么默认不执行?

sqlite optimization analyzer sql-execution-plan

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

分析隐含的CAST

我有一个学术场景,我想知道如何分析.

DECLARE @date DATETIME
SET     @date = getDate()
SET     @date = DATEADD(DAY, DATEDIFF(DAY, 0, @date-3), 3)
Run Code Online (Sandbox Code Playgroud)

这将把日期缩短到星期四.

我所面临的挑战是证明存在隐式 CAST的地方.

有三个地方,我认为这必须发生......

DATEADD(
  DAY,
  DATEDIFF(
    DAY,
    0,          -- Implicitly CAST to a DATETIME?
    @date-3     -- I presume the `3` is being implicitly cast to a DATETIME?
  ),
  3             -- Another implicit CAST to a DATETIME?
)
Run Code Online (Sandbox Code Playgroud)

但是,也许,因为03是常量,这是在编译执行计划期间完成的吗?

但如果3是INT变量,会有所不同吗?


有没有办法分析执行计划或其他方法,以便能够不确定地确定这个?

为了使问题更复杂,我现在不在现场.我正试图远程协助同事.这意味着我无法直接访问SSMS等.

sql sql-server-2005 implicit-conversion sql-execution-plan

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

Oracle 相当于 Postgres EXPLAIN ANALYZE

类似于这个问题

我想在 Oracle (10g) 中获得类似于 PostgreSQL 中的 EXPLAIN ANALYZE 的详细查询计划和实际执行。有等价物吗?

sql oracle sql-execution-plan

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

为什么 Postgres 扫描一个巨大的表而不是使用我的索引?

我注意到我的一个 SQL 查询比我预期的要慢得多,结果查询计划程序提出了一个对我来说似乎很糟糕的计划。我的查询如下所示:

select A.style, count(B.x is null) as missing, count(*) as total
  from A left join B using (id, type)
  where A.country_code in ('US', 'DE', 'ES')
  group by A.country_code, A.style
  order by A.country_code, total
Run Code Online (Sandbox Code Playgroud)

B 有一个 (type, id) 索引,A 有一个 (country_code, style) 索引。A 比 B 小得多:A 中有 250K 行,B 中有 100M。

所以,我希望查询计划看起来像:

  • 使用 A 上的索引只选择那些具有适当 country_code
  • 与 B 左连接,根据其(type, id)索引查找匹配行(如果有)
  • 根据country_code和分组事物style
  • 将计数相加

但是查询规划器决定执行此操作的最佳方法是对 B 进行顺序扫描,然后对 A 进行右连接。我无法理解为什么会这样;有没有人有想法?这是它生成的实际查询计划:

 Sort  (cost=14283513.27..14283513.70 rows=171 width=595)
   Sort Key: a.country_code, …
Run Code Online (Sandbox Code Playgroud)

sql postgresql indexing performance sql-execution-plan

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

了解执行计划中的执行次数

以下是以下查询的简单执行计划。

询问:

SELECT TOP (25) orderid, custid, empid, shipperid, orderdate, filler
FROM dbo.Orders
ORDER BY orderid;
Run Code Online (Sandbox Code Playgroud)

执行计划: 在此处输入图片说明

我的问题是如何理解执行次数

以下是所有操作符的执行次数

嵌套循环:
估计执行次数:1
实际执行次数:1

索引扫描:
估计执行次数:1
实际执行次数:1

关键查找:
估计执行次数:25
实际执行次数:25

我的问题是

  1. 为什么嵌套循环只显示 1 个执行计数?

  2. 索引扫描也只显示一个执行计数,但它在一次执行中得到 25 行。这些行是存储在行集缓存中还是某个缓存中?嵌套循环是否会从缓存中取出一行并为每一行调用键查找 25 次?

以下是来自 Itzik Ben-Gan 的解释

例如,如果告诉它停止的 Top 迭代器出现在计划的后面,索引扫描迭代器如何知道在 25 行后停止?答案是内部 API 调用从根节点开始(在我们的例子中是 SELECT 迭代器)。此根节点调用 Top 迭代器。Top 迭代器调用一个方法 25 次,从 Nested Loops 迭代器请求一行。反过来,嵌套循环迭代器调用一个方法 25 次,从索引扫描迭代器中请求一行。因此,索引扫描迭代器不会超出它扫描的前 25 行。简而言之,虽然遵循数据流顺序来解释计划通常更直观

但是为什么执行计数只显示 1。如果我遗漏了什么,请告诉我。附上执行计划

更新(2017 年 1 月):

我问过一些关于堆栈溢出的类似问题。有关相同..的更多详细信息,请参阅此答案。

https://dba.stackexchange.com/questions/134172/set-statistics-io-for-nested-loops

sql-server sql-execution-plan

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

行级安全查询计划比相同的非 RLS 查询慢 45 倍

我在让查询规划器为启用行级安全性 (RLS) 的表编写良好的计划时遇到一些麻烦。似乎所需要做的就是从启用行级安全性的表到启用非行级安全性的表的联接来强制执行错误的计划,即使规划器应该能够使用两个表上都有适当的索引。

有没有办法帮助规划者解决这个问题?或者当涉及 RLS 时某些统计数据不可用?

USING (TRUE)我尝试为不需要 RLS 的表启用 RLS(使用 添加广泛开放的策略),这与在该表上不包含策略具有相同的效果。

DROP SCHEMA IF EXISTS foo CASCADE;
CREATE SCHEMA foo;

CREATE TABLE foo.bar AS
SELECT generate_series(1,10000000) AS id, md5(random()::text) AS descr, random() * 5 + 1 AS licflag;

CREATE TABLE foo.baz AS
SELECT generate_series(1,10000000) AS id, md5(random()::text) AS descr, random() * 5 + 1 AS licflag;

CREATE UNIQUE INDEX ON foo.bar (id);
CREATE INDEX ON foo.bar (licflag);

CREATE UNIQUE INDEX ON foo.baz (id);
CREATE INDEX ON foo.baz (licflag); …
Run Code Online (Sandbox Code Playgroud)

postgresql performance row-level-security sql-execution-plan

5
推荐指数
0
解决办法
840
查看次数

Postgresql - 如何加快更新大表(1亿行)?

我有两张大桌子:

Table "public.tx_input1_new" (100,000,000 rows) 

     Column     |            Type             | Modifiers
----------------|-----------------------------|----------
 blk_hash       | character varying(500)      |
 blk_time       | timestamp without time zone |
 tx_hash        | character varying(500)      |
 input_tx_hash  | character varying(100)      |
 input_tx_index | smallint                    |
 input_addr     | character varying(500)      |
 input_val      | numeric                     |

Indexes:
    "tx_input1_new_h" btree (input_tx_hash, input_tx_index) 
Run Code Online (Sandbox Code Playgroud)
Table "public.tx_output1_new" (100,000,000 rows)

    Column    |          Type          | Modifiers
--------------+------------------------+-----------
 tx_hash      | character varying(100) |
 output_addr  | character varying(500) |
 output_index | smallint               |
 input_val    | numeric                |

Indexes: …
Run Code Online (Sandbox Code Playgroud)

postgresql performance sql-execution-plan sql-update

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

Postgres:为什么LEFT JOIN会影响查询计划?

我有PostgreSQL 9.5.9和两个表:table1和table2

 Column   |              Type              |                 Modifiers                 
------------+--------------------------------+-------------------------------------------
 id         | integer                        | not null
 status     | integer                        | not null
 table2_id  | integer                        | 
 start_date | timestamp(0) without time zone | default NULL::timestamp without time zone
Indexes:
    "table1_pkey" PRIMARY KEY, btree (id)
    "table1_start_date" btree (start_date)
    "table1_table2" btree (table2_id)
Foreign-key constraints:
    "fk_t1_t2" FOREIGN KEY (table2_id) REFERENCES table2(id)


 Column |          Type           |            Modifiers            
--------+-------------------------+---------------------------------
 id     | integer                 | not null
 name   | character varying(2000) | default NULL::character varying
Indexes:
    "table2_pkey" PRIMARY KEY, …
Run Code Online (Sandbox Code Playgroud)

sql postgresql sql-execution-plan

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