我用Google搜索了这个问题,似乎无法找到一致的意见,或许多基于可靠数据的意见.我只想知道在SQL SELECT语句中使用通配符是否会产生额外的开销,而不是单独调用每个项目.我已经在几个不同的测试查询中比较了两者的执行计划,似乎估计总是读取相同的.是否有可能在其他地方产生一些开销,或者它们是否真的处理相同?
我具体指的是:
SELECT *
Run Code Online (Sandbox Code Playgroud)
与
SELECT item1, item2, etc.
Run Code Online (Sandbox Code Playgroud) 我在做:
explain select * from calibration;
Run Code Online (Sandbox Code Playgroud)
它说52133456345632行
当我做:
select count(*) from calibration;
Run Code Online (Sandbox Code Playgroud)
我正在收到52134563456961
谁能解释一下这里发生的事情?
我有一个带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)
第二个似乎效率更低.是否因为它可能会返回更多结果,因此更复杂的查询得到回报?
我刚刚将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
(不确定这是否已经讨论过......)
在为类别构建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
我怎样才能让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
对于以下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中正常工作!
但: …
据我所知,堆表是没有聚簇索引的表,没有物理顺序.我有一个堆栈表"扫描"有120k行,我使用这个选择:
SELECT id FROM scan
Run Code Online (Sandbox Code Playgroud)
如果我为列"id"创建一个非聚集索引,我会得到223个物理读取.如果我删除非聚集索引并更改表以使"id"成为我的主键(以及我的聚集索引),我将获得515个物理读取.
如果聚集索引表是这样的图片:

为什么Clustered Index Scans像表扫描一样工作?(或者在检索所有行的情况下更糟).为什么它不使用具有较少块的"聚簇索引表"并且已经具有我需要的ID?
我将在前言中说,我讨厌XML,可怕的东西,但有时是必要的.
我当前的问题是我正在尝试从执行计划中获取XML(由用户提供,因此可以是任何大小)并将其粉碎成表格以供进一步操作.我现在有两种选择;
过去有人做过类似的练习吗?我发现的所有示例查询都已知道输出字段.
我正在学习如何阅读SQL Server中的实际执行计划.我注意到,SQL服务器趋向于表示在物理查询计划,作为例如用于中间值expr1006,expr1007等(即expr,随后的数).
这是一个截图.请注意底部附近expr1006, expr1008, expr1009的部分中列出的表达式output list.
有可能找出它们真正代表的东西吗?
sql-server ×6
sql ×5
t-sql ×3
mysql ×2
aggregation ×1
c# ×1
count ×1
indexing ×1
linq-to-sql ×1
overhead ×1
performance ×1
postgresql ×1
random ×1
upgrade ×1
wildcard ×1
xml ×1