我有以下问题.
我正在尝试使用MVC3,EF4和jquery在450万条记录的表上实现自动完成选择器.
这是表:
CREATE TABLE [dbo].[CONSTA] (
[afpCUIT] nvarchar(11) COLLATE Modern_Spanish_CI_AS NOT NULL,
[afpNombre] nvarchar(30) COLLATE Modern_Spanish_CI_AS NULL,
[afpGanancias] varchar(2) COLLATE Modern_Spanish_CI_AS NULL,
[afpIVA] varchar(2) COLLATE Modern_Spanish_CI_AS NULL,
[afpMonot] varchar(2) COLLATE Modern_Spanish_CI_AS NULL,
[afpIntSoc] varchar(1) COLLATE Modern_Spanish_CI_AS NULL,
[afpEmpl] varchar(1) COLLATE Modern_Spanish_CI_AS NULL,
[afpAct] varchar(2) COLLATE Modern_Spanish_CI_AS NULL,
CONSTRAINT [CONSTA_pk] PRIMARY KEY CLUSTERED ([afpCUIT])
)
ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [CONSTA_Nombre_idx] ON [dbo].[CONSTA]
([afpNombre])
WITH (
PAD_INDEX = OFF,
DROP_EXISTING = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF, …Run Code Online (Sandbox Code Playgroud) sql-server performance entity-framework-4 sql-execution-plan sql-server-2008r2-express
我有一个相对简单的查询问题和执行计划Access选择它.
查询是这种形式
SELECT somethings
FROM A INNER JOIN (B INNER JOIN (C INNER JOIN D ON ...) ON ...) ON ...
WHERE A.primaryKey= 1 AND D.d = 2;
Run Code Online (Sandbox Code Playgroud)
C和D的行数相对较少.A和B有几千行.
该查询返回2行(不确定这是否相关)真的很慢.它运行17秒.如果我删除AND D.d = 2where子句的一部分,查询现在返回4行并立即运行.
所以我的理解是JET引擎可以立即运行查询而不在Dd上使用过滤器,然后立即执行所述过滤器(仅过滤4行).因此,使用D.d = 2过滤器运行查询不应该太长.
我试图创建一个没有过滤器的子查询,并将其包含在另一个只过滤结果的查询中,但它仍然很慢.我的猜测是JET引擎足够聪明以"扁平化"子查询,因此结果是相同的.
因为我无法按照我的意愿运行查询,所以我使用了JETSHOWPLAN,以便Access输出它的执行计划.这是我发现的:
对于快速查询(没有D.d = 2),查询计划的第一步是A.primaryKey = 1在A表上应用过滤器.这导致超过30000的数据集为1行.然后,连接似乎是使用索引从A到D执行,数据集永远不会超过4行.
慢查询似乎以逆转顺序执行.首先连接D和C然后D.d = 2进行测试.之后,执行从C到A的连接.通过这种方式,需要从D到C,从C到B以及从B到A连接的数据要大得多.当执行所有JOIN并且执行之前A.primaryKey=1,数据集将具有120K行.
有没有办法在Access上强制执行正确的查询计划?
我希望我很清楚.如果我发布查询计划,请告诉我.我没有,因为它们很大.
提前致谢,
熔点
我们的客户遇到了一些不一致数据的问题,我们给了他们一个查询来修复它.
现在,在运行查询之前,客户要求我提供一个查询,该查询将提供运行该查询所需的临时空间.这实际上很重要,因为此查询可能会影响表中的许多条目.
以下是我发送给他们修复问题的查询:
declare
cursor cur is select distinct SEQID from D_LEAD where SEQID IN( SELECT SEQID FROM D_LEAD WHERE CURR_FLAG = 1 GROUP BY
SEQID HAVING COUNT(SEQID) >1);
seq NUMBER;
begin
open cur;
loop
fetch cur into seq;
update D_LEAD set CURR_FLAG = 0 where LEAD_ID IN (SELECT LEAD_ID FROM D_LEAD WHERE ((LEAD_ID != (SELECT MAX(LEAD_ID) FROM D_LEAD WHERE SEQID=seq)) AND SEQID=seq));
exit when cur%NOTFOUND;
end loop;
close cur;
commit;
end;
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
我编写了一个复杂的oracle sql查询,解释计划统计信息如下所示:成本:209,201字节:187,944,150基数:409,675
现在,DBA调整了查询,统计数据如下所示:成本:42,996字节:89,874,138基数:209,226
我的第一个问题是,如果数字较低,它会自动意味着更好的表现吗?哪个数字最适合?成本/基数/字节?我的第二个问题是:我理解基数是读取的行数.但是当我运行查询时,它返回'0'行!我的印象是,对于应该返回相同结果集的两个查询,基数必须相同.我觉得这是错的?
在empno上具有集群唯一索引的表结构.
CREATE TABLE [dbo].[EMP](
[EMPNO] [int] NOT NULL,
[ENAME] [varchar](10) NULL,
[JOB] [varchar](9) NULL,
[MGR] [int] NULL,
[HIREDATE] [datetime] NULL,
[SAL] [int] NULL,
[COMM] [int] NULL,
[DEPTNO] [int] NULL
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
询问
SELECT sal,sum(sal) over(PARTITION BY empno)
FROM emp
Run Code Online (Sandbox Code Playgroud)
查询计划

这是我的第一篇文章....
我有一个查询所花的时间比我想要的要长(不是我们所有人!)取决于我在WHERE子句中输入的内容……它可能运行得更快。我试图理解为什么查询计划与众不同,并且我可以做些什么来加快整个查询的速度。
这是查询1:
SELECT date_observed, base_value
FROM device_read_data
WHERE fk_device_rw_id IN
(SELECT fk_device_rw_id FROM equipment_set_rw
WHERE fk_equipment_set_id = CAST('ed151028-1fc0-11e3-b79f-47c0fd87d2b4' AS uuid))
AND date_observed
BETWEEN '2013-12-01 07:45:00+00'::timestamptz
AND '2014-01-01 07:59:59+00'::timestamptz
AND base_value ~ '[0-9]+(\.[0-9]+)?'
;
Run Code Online (Sandbox Code Playgroud)
"Hash Semi Join (cost=11.65..5640243.59 rows=92194 width=16) (actual time=34.947..132522.023 rows=43609 loops=1)"
" Hash Cond: (device_read_data.fk_device_rw_id = equipment_set_rw.fk_device_rw_id)"
" -> Seq Scan on device_read_data (cost=0.00..5449563.56 rows=72157042 width=32) (actual time=0.844..123760.331 rows=71764376 loops=1)"
" Filter: ((date_observed >= '2013-12-01 07:45:00+00'::timestamp with time zone) AND (date_observed <= '2014-01-01 07:59:59+00'::timestamp with …Run Code Online (Sandbox Code Playgroud) 我正在使用MS SQL Server 2008 R2.我有一个名为rpt_getWeeklyScheduleData的存储过程.这是我用于在特定数据库中查找其执行计划的查询:
select
*
from
sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st
where
OBJECT_NAME(st.objectid, st.dbid) = 'rpt_getWeeklyScheduleData' and
st.dbid = DB_ID()
Run Code Online (Sandbox Code Playgroud)
上面的查询返回9行.我期待一排.
此存储过程已被多次修改,因此我相信SQL Server在修改和运行时一直在为其构建新的执行计划.这是正确的解释吗?如果没有,那你怎么解释这个?
还有可能看到每个计划何时创建?如果是,那怎么样?
这是存储过程的签名:
CREATE procedure [dbo].[rpt_getWeeklyScheduleData]
(
@a_paaipk int,
@a_location_code int,
@a_department_code int,
@a_week_start_date varchar(12),
@a_week_end_date varchar(12),
@a_language_code int,
@a_flag int
)
as
begin
...
end
Run Code Online (Sandbox Code Playgroud)
存储过程很长; 如果条件都为@a_flag参数,则只有2个.
if @a_flag = 0
begin
...
end
if @a_flag = 1
begin
...
end
Run Code Online (Sandbox Code Playgroud) 我试图测试PostgreSQL中不同分区模式的效率.我用一个表和不同的分区大小创建了几个数据库,然后在每个数据库中填充了数亿个记录.
现在我想测试所有这些查询并比较结果.但问题是,当我运行相同的查询时,我在一个数据库上收到了不同的实际时间.
例如,我EXPLAIN (buffers, analyze, verbose) SELECT count(*) FROM testdata WHERE dt = '2017-06-01 08:50:00'第一次执行:
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=356199.96..356199.97 rows=1 width=8) (actual time=155757.190..155757.190 rows=1 loops=1)
Output: count(*)
Buffers: shared read=290555
-> Append (cost=0.00..354506.51 rows=677381 width=0) (actual time=165.565..155583.815 rows=665275 loops=1)
Buffers: shared read=290555
-> Seq Scan on public.testdata (cost=0.00..0.00 rows=1 width=0) (actual time=0.002..0.002 rows=0 loops=1)
Filter: (testdata.dt = '2017-06-01 08:50:00'::timestamp without time zone)
-> Bitmap Heap Scan on public.testdata_2017_06_01 (cost=12682.26..354506.51 rows=677380 width=0) (actual time=165.562..155319.677 rows=665275 loops=1)
Recheck Cond: …Run Code Online (Sandbox Code Playgroud) 我正在分析我的查询。
postgres=# explain analyze select * from student;
QUERY PLAN
------------------------------------------------------------------------------------------------------
Seq Scan on student (cost=0.00..22.00 rows=1200 width=40) (actual time=0.005..0.005 rows=7 loops=1)
Planning time: 0.035 ms
Execution time: 0.019 ms
(3 rows)
Run Code Online (Sandbox Code Playgroud)
我不知道loop = 1意味着什么Seq Scan on student (cost=0.00..22.00 rows=1200 width=40) (actual time=0.005..0.005 rows=7 loops=1)。
我已经搜索了postgres文档,但是没有找到关于循环参数的任何很好的参考。
提前致谢。
sql ×5
postgresql ×3
sql-server ×3
database ×2
amazon-rds ×1
explain ×1
join ×1
ms-access ×1
mysql ×1
oracle ×1
oracle11g ×1
performance ×1
select ×1