如果查询同时包含group by和order by子句,那么SQL后面的执行顺序是什么.它取决于它们在查询中的位置???
我正在比较查询我的开发和生产数据库.
它们都是Oracle 9i,但几乎每个查询都有完全不同的执行计划,具体取决于数据库.
所有表/索引都相同,但dev数据库大约是每个表的1/10行.
在生产中,它为大多数查询选择的查询执行计划与开发不同,并且成本高出1000倍.在某些情况下(生成表访问),生产查询似乎也没有使用正确的查询索引.
我最近也在两个数据库上运行了dbms_utility.analyze模式,希望CBO可以解决问题.
是否有其他潜在的oracle配置可能导致此问题?
我主要是开发人员,所以这种DBA分析起初相当混乱.
题:
将DateTime.Now
参数作为参数传递给proc会阻止SQL Server缓存查询计划吗?如果是这样,那么网络应用程序是否错过了巨大的性能提升?
可能解决方案
我认为DateTime.Today.AddDays(1)
这是一个可能的解决方案.它会将相同的结束日期传递给sql proc(每天).用户仍然可以获得最新数据.请同意这一点.
举例:
假设我们有一个存储过程.它将数据报告给网页上的用户.用户可以设置日期范围.如果用户将今天的日期设置为"结束日期",其中包括今天的数据,则Web应用程序将传递DateTime.Now
给sql proc.
假设一个用户运行一个报告5/1/2010
- now
经过多次转发.在网页上,用户看到5/1/2010
到5/4/2010
.但是web应用程序DateTime.Now
作为结束日期传递给sql proc.因此,尽管用户正在查询类似的日期范围,但proc中的结束日期将始终不同.
假设表中的记录数和用户数都很大.所以任何性能提升都很重要 因此问题的重要性.
示例proc和execution(如果这有助于理解):
CREATE PROCEDURE GetFooData
@StartDate datetime
@EndDate datetime
AS
SELECT *
FROM Foo
WHERE LogDate >= @StartDate
AND LogDate < @EndDate
Run Code Online (Sandbox Code Playgroud)
这是使用DateTime.Now的示例执行:
EXEC GetFooData '2010-05-01', '2010-05-04 15:41:27' -- passed in DateTime.Now
Run Code Online (Sandbox Code Playgroud)
这是使用DateTime.Today.AddDays(1)的示例执行
EXEC GetFooData '2010-05-01', '2010-05-05' -- passed in DateTime.Today.AddDays(1)
Run Code Online (Sandbox Code Playgroud)
两个过程都返回相同的数据,因为当前时间是:2010-05-04 15:41:27
.
请考虑以下查询.
select * from contact where firstname like '%some%'
select * from
(select * from contact) as t1
where firstname like '%some%'
Run Code Online (Sandbox Code Playgroud)
两个查询的执行计划相同并且同时执行.但是,我期望第二个查询将有一个不同的计划并执行得更慢,因为它必须从联系人中选择所有数据并应用过滤器.看起来我错了.
我想知道这是怎么回事?
数据库服务器:SQL Server 2005
可能重复:
SQL Server如何计算出估计的行数?
我只是在查看SQL Server图形执行计划,我遇到了以下两个信息:
我想知道为什么会出现这种差异.你能解释一下他们之间的区别吗?如果你能用一些例子来解释它会很有帮助.
谢谢.
我在SQL Server中创建了一个简单的表:
MemberId INT PRIMARY KEY Identity
Name NVARCHAR(100) NULL
Description NVARCHAR(250) NULL
Run Code Online (Sandbox Code Playgroud)
当我将MemberId创建为主键时,添加的唯一索引是聚簇索引.我没有为Name或Description添加索引.
我向表中添加了大约30,000行测试数据并执行以下查询:
SELECT * FROM Members WHERE Name = 'Foo'
Run Code Online (Sandbox Code Playgroud)
执行计划说如下:
Clustered Index Scan - cost 100%
Run Code Online (Sandbox Code Playgroud)
这是一个聚簇索引如何扫描?我不是在预测聚簇索引.我认为这更像是一次桌面扫描.谁可以给我解释一下这个?如果没有,究竟会导致表扫描的原因是什么?
我在我的Microsoft SQL Server(2012 Express)数据库上运行以下SQL查询,它工作正常,在不到一秒的时间内执行:
SELECT
StringValue, COUNT(StringValue)
FROM Attributes
WHERE
Name = 'Windows OS Version'
AND StringValue IS NOT NULL
AND ProductAssociation IN (
SELECT ID
FROM ProductAssociations
WHERE ProductCode = 'MyProductCode'
)
GROUP BY StringValue
Run Code Online (Sandbox Code Playgroud)
我在内部查询中添加了一个过滤器,它继续正常工作,返回的结果略少(如预期的那样),并且在不到一秒的时间内执行.
SELECT
StringValue, COUNT(StringValue)
FROM Attributes
WHERE
Name = 'Windows OS Version'
AND StringValue IS NOT NULL
AND ProductAssociation IN (
SELECT ID
FROM ProductAssociations
WHERE ProductCode = 'MyProductCode'
AND ID IN (
SELECT A2.ProductAssociation
FROM Attributes A2
WHERE A2.Name = 'Is test' AND …
Run Code Online (Sandbox Code Playgroud) 我有一个查询并检查SQL Management Studio中的执行计划.某些非聚集索引扫描步骤将返回表的PK列,而不是索引和连接列.例:
select a.c10, b.c20
from a inner join b on a.c11 = b.c21
where a.c12 = 23
Run Code Online (Sandbox Code Playgroud)
表a上的索引:
create unique nonclustered index ix_a_1 on a (a.c12 asc) include ( a.c13, a.c14)
Run Code Online (Sandbox Code Playgroud)
查询计划显示:
index seek, nonclustered, ix_a_1 , output list: a.primary_key_col
Run Code Online (Sandbox Code Playgroud)
查询中未使用a.primary_key_col列.为什么这是输出列表中包含的唯一列?
我遇到一种情况,即Oracle为给定查询创建多个执行计划。大多数情况下,它会选择性能良好的特定产品。但是,有时它选择一个包含笛卡尔连接的连接,这是非常错误的。如果我们删除笛卡尔联接计划并使用其他计划之一运行查询,则该查询执行良好,这向我暗示了基础数据确实不需要笛卡尔。
我们曾尝试收集统计数据并摆正直方图,但最终,笛卡尔联接执行计划似乎又回来了,并被间歇性地使用(有时需要数周或数月)。
在Oracle中是否可以禁用特定的执行计划?我们不能只是删除它,因为它似乎又回来了,但是将其保留并禁用它应该可以解决,但是我真的不知道该怎么做或是否有可能。
任何人都可以告诉我什么时候应该使用gather_plan_statistics提示或何时应该使用解释计划.gather_plan_statistics提示的实际目的是什么.
sql ×6
sql-server ×5
oracle ×3
performance ×2
caching ×1
database ×1
oracle9i ×1
select ×1
t-sql ×1