标签: sql-execution-plan

Sql通配符:性能开销?

我用Google搜索了这个问题,似乎无法找到一致的意见,或许多基于可靠数据的意见.我只想知道在SQL SELECT语句中使用通配符是否会产生额外的开销,而不是单独调用每个项目.我已经在几个不同的测试查询中比较了两者的执行计划,似乎估计总是读取相同的.是否有可能在其他地方产生一些开销,或者它们是否真的处理相同?

我具体指的是:

SELECT *
Run Code Online (Sandbox Code Playgroud)

SELECT item1, item2, etc.
Run Code Online (Sandbox Code Playgroud)

sql performance wildcard overhead sql-execution-plan

3
推荐指数
1
解决办法
1827
查看次数

EXPLAIN和COUNT返回两个不同的值

我在做:

explain select * from calibration;
Run Code Online (Sandbox Code Playgroud)

它说52133456345632行

当我做:

select count(*) from calibration;
Run Code Online (Sandbox Code Playgroud)

我正在收到52134563456961

谁能解释一下这里发生的事情?

mysql sql count sql-execution-plan

3
推荐指数
1
解决办法
408
查看次数

PostgreSql:具有相同列的不同查询计划

我有一个带2个外键的表,让我们称它们为fk1和fk2.两者都有相同的类型和相同的索引.但是当我"解释"一个简单的选择查询时,我得到完全不同的查询计划.对于fk1:

explain select * from mytable where fk1 = 1;
Run Code Online (Sandbox Code Playgroud)

结果

Index Scan using fk1_idx on mytable  (cost=0.00..9.32 rows=2 width=4)
  Index Cond: (fk1 = 1)
Run Code Online (Sandbox Code Playgroud)

对于fk2

explain select * from mytable where fk2 = 1;
Run Code Online (Sandbox Code Playgroud)

结果:

Bitmap Heap Scan on mytable  (cost=5.88..659.18 rows=208 width=4)
  Recheck Cond: (fk2 = 1)
  ->  Bitmap Index Scan on fk2_idx  (cost=0.00..5.83 rows=208 width=0)
        Index Cond: (fk2 = 1)
Run Code Online (Sandbox Code Playgroud)

第二个似乎效率更低.是否因为它可能会返回更多结果,因此更复杂的查询得到回报?

postgresql sql-execution-plan

3
推荐指数
1
解决办法
360
查看次数

SQL Server版本升级和缓存执行计划

我刚刚将SQL Server 2008 R2 Express Edition升级到SQL Server 2008 R2标准版.安装工具执行升级没有任何问题.

然而,承诺的性能提升并不在这里.例如,SQL Server使用单CPU核心.

我假设SQL Server仍然使用SP的"旧"执行计划.如果是这样,有没有办法重建/重置执行计划?

或者在将Express升级到标准版时我应该考虑其他问题吗?

如果应将其移至ServerFault,请告知我们.

sql-server stored-procedures upgrade sql-server-2008-r2 sql-execution-plan

3
推荐指数
1
解决办法
298
查看次数

"使用sort_union"是什么意思?

(不确定这是否已经讨论过......)

在为类别构建SQL时

示例类别数据:

ID | NAME
--------------------------
1  | hardware
2  | hardware : notebooks
3  | hardware : phones
4  | hardware : desktops
5  | review
6  | review : photo gallery
Run Code Online (Sandbox Code Playgroud)

hardware 将是的父类别 hardware : *

当我考虑构建api来查询数据库时

desc select * from category 
where id=1 or 
name like concat((select name from category where id in(1)), '_%');
Run Code Online (Sandbox Code Playgroud)

上述退货(执行计划中)

Using sort_union(PRIMARY,some_index); Using where
Run Code Online (Sandbox Code Playgroud)

有什么sort_union办法?
好吗?坏?要避免?


(理解我可以将整个查询重写为更优化的方式,
但是我有一些限制来重新构建整个api)


mysql版本5.1

mysql sql-execution-plan

3
推荐指数
1
解决办法
1497
查看次数

SQL Server通过聚合选择随机(或第一)值

我怎样才能让SQL Server返回第一个值(任何一个,我不在乎,它只需要快速)聚合时会遇到什么?

例如,假设我有:

ID      Group
1       A
2       A
3       A
4       B
5       B
Run Code Online (Sandbox Code Playgroud)

我需要为每个组获取任何一个ID.我可以这样做:

Select 
max(id)
,group 
from Table 
group by group
Run Code Online (Sandbox Code Playgroud)

返回

ID      Group
3       A
5       B
Run Code Online (Sandbox Code Playgroud)

这样做,但是当我要求SQL Server计算最高ID时,我真的需要做的就是选择它遇到的第一个ID,这似乎很愚蠢.

谢谢

PS - 字段被编入索引,所以它可能没有什么区别?

sql-server random aggregation sql-server-2008 sql-execution-plan

3
推荐指数
1
解决办法
1403
查看次数

麻烦一些linq2sql生成的T-SQL

对于以下LINQ2SQL查询,我遇到SQL超时问题:

DateTime date = DateTime.Parse("2013-08-01 00:00:00.000");

Clients.Where(e => 
    (
        !Orders.Any(f => f.ClientId.Equals(e.Id) && f.OrderDate >= date)
        ||
        Comments.Any(f => f.KeyId.Equals(e.Id))
    )
).Count().Dump();
Run Code Online (Sandbox Code Playgroud)

在LinqPad中运行它时,将需要永远完成,如果在服务器上运行,将成为SQL超时.

生成的SQL代码:

-- Region Parameters
DECLARE @p0 DateTime = '2013-08-01 00:00:00.000'
-- EndRegion
SELECT COUNT(*) AS [value]
FROM [Clients] AS [t0]
WHERE (NOT (EXISTS(
    SELECT NULL AS [EMPTY]
    FROM [Orders] AS [t1]
    WHERE ([t1].[ClientId] = [t0].[Id]) AND ([t1].[OrderDate] >= @p0)
    ))) OR (EXISTS(
    SELECT NULL AS [EMPTY]
    FROM [Comments] AS [t2]
    WHERE [t2].[KeyId] = [t0].[Id]
    ))
Run Code Online (Sandbox Code Playgroud)

在SQL-studio中正常工作!

但: …

c# t-sql sql-server linq-to-sql sql-execution-plan

3
推荐指数
1
解决办法
194
查看次数

为什么NonClustered索引扫描比聚簇索引扫描更快?

据我所知,堆表是没有聚簇索引的表,没有物理顺序.我有一个堆栈表"扫描"有120k行,我使用这个选择:

SELECT id FROM scan
Run Code Online (Sandbox Code Playgroud)

如果我为列"id"创建一个非聚集索引,我会得到223个物理读取.如果我删除非聚集索引并更改表以使"id"成为我的主键(以及我的聚集索引),我将获得515个物理读取.

如果聚集索引表是这样的图片:

在此输入图像描述

为什么Clustered Index Scans像表扫描一样工作?(或者在检索所有行的情况下更糟).为什么它不使用具有较少块的"聚簇索引表"并且已经具有我需要的ID?

sql sql-server indexing full-table-scan sql-execution-plan

3
推荐指数
1
解决办法
4059
查看次数

从执行计划中粉碎XML

我将在前言中说,我讨厌XML,可怕的东西,但有时是必要的.

我当前的问题是我正在尝试从执行计划中获取XML(由用户提供,因此可以是任何大小)并将其粉碎成表格以供进一步操作.我现在有两种选择;

  1. 我可以计算出可用于执行计划的最大节点数量(我怀疑这将是很多)并创建可用于任何XML输入的整个脚本.这将是一次性事情,所以不是问题.
  2. 另一种方法是动态计算节点数量,并根据要求创建输出.

过去有人做过类似的练习吗?我发现的所有示例查询都已知道输出字段.

xml sql t-sql sql-server sql-execution-plan

3
推荐指数
2
解决办法
369
查看次数

如何找出SQL Server执行计划中使用的中间值所代表的内容

我正在学习如何阅读SQL Server中的实际执行计划.我注意到,SQL服务器趋向于表示在物理查询计划,作为例如用于中间值expr1006,expr1007等(即expr,随后的数).

这是一个截图.请注意底部附近expr1006, expr1008, expr1009的部分中列出的表达式output list.

在此输入图像描述

有可能找出它们真正代表的东西吗?

sql t-sql sql-server sql-execution-plan

3
推荐指数
1
解决办法
191
查看次数