WildSery писал(а):Читай мой пост.
Читал, но в твоем примере выбор однозначен - только ХП, я же имею в виду случаи, когда можно реализовать и так и сяк.
kdv писал(а):
топик мутный. какие-то "критерии", то пример хочу, то не хочу...
ммм, возможно я не совсем внятно объяснил, что меня интересует

возьмем, например:
http://forum.ibase.ru/phpBB2/viewtopic.php?t=2453
таблицу увеличил до 100000 записей
сделал у себя копию таблицы, таблицу увеличил до 100000 записей
индекс только по полю RID-первичный ключ
с ХП
Код: Выделить всё
CREATE PROCEDURE PR_TB1
RETURNS (
PRID INTEGER,
PUID INTEGER,
PF1 VARCHAR(10),
PF2 VARCHAR(10),
PV1 INTEGER,
PV2 INTEGER)
AS
DECLARE VARIABLE VUID INTEGER;
DECLARE VARIABLE VV1 INTEGER;
DECLARE VARIABLE VV2 INTEGER;
begin
/* Procedure Text */
for select t1.uid, max(t1.v1), max(t1.v2) from tb1 t1
group by t1.uid into :vuid,:vv1,:vv2
do
begin
select t2.rid, t2.uid,t2.f1,t2.f2,t2.v1,t2.v2 from tb1 t2
where t2.uid=:vuid and t2.v1=:vv1 and t2.v2=:vv2
into :prid,:puid,:pf1,:pf2,:pv1,:pv2;
suspend;
end
end
------ Performance info ------
Prepare time = 32ms
Execute time = 12s 312ms
Avg fetch time = 439,71 ms
Current memory = 1 010 796
Max memory = 1 098 780
Memory buffers = 2 048
Reads from disk to cache = 1
Writes from cache to disk = 3
Fetches from cache = 315 180 077
с запросом
Код: Выделить всё
select t1.rid, t1.uid, t1.f1,t1.f2,t1.v1,t1.v2
from tb1 t1
where (select t2.uid
from tb1 t2
where t1.uid=t2.uid
group by uid
having t1.v1=max(t2.v1) and t1.v2=max(t2.v2)
) is not null
План
PLAN SORT ((T2 NATURAL))
PLAN (T1 NATURAL)
Адаптированный план
PLAN SORT ((T2 NATURAL)) PLAN (T1 NATURAL)
------ Performance info ------
Prepare time = 0ms
Execute time = 2h 22m 36s 828ms
Avg fetch time = 427 841,40 ms
Current memory = 851 748
Max memory = 986 644
Memory buffers = 2 048
Reads from disk to cache = 958
Writes from cache to disk = 6
Fetches from cache = -711 804 446
построение индекса по UID меняет ситуацию кардинально
с ХП
------ Performance info ------
Prepare time = 125ms
Execute time = 31ms
Avg fetch time = 1,19 ms
Current memory = 1 009 676
Max memory = 1 089 852
Memory buffers = 2 048
Reads from disk to cache = 1
Writes from cache to disk = 3
Fetches from cache = 43 828
с запросом
План
PLAN (T2 ORDER TB1_IDX1)
PLAN (T1 NATURAL)
Адаптированный план
PLAN (T2 ORDER TB1_IDX1) PLAN (T1 NATURAL)
------ Performance info ------
Prepare time = 0ms
Execute time = 3s 484ms
Avg fetch time = 174,20 ms
Current memory = 1 071 284
Max memory = 1 206 180
Memory buffers = 2 048
Reads from disk to cache = 0
Writes from cache to disk = 6
Fetches from cache = 1 633 272
но всегда ли оправдано построение индекса для ускорения запроса? ведь тут еще зависит, сколько дубликатов
возможно в других случаях правильнее использовать ХП?
сорри за столь здоровенный пост
