|
|
|
как выбрать строки с которых начинаются другие строки?
|
|||
|---|---|---|---|
|
#18+
пусть есть таблица с полями Id serial, Phone_Prefix char(20). как выбрать строки с которых начинаются другие строки? select r1.fsphone_prefix from regions_tq r1 where exists( select r2.fsphone_prefix from regions_tq r2 where r2.fsphone_prefix like r1.fsphone_prefix || '%' and firegion_id<>r1.firegion_id) order by r1.fsphone_prefix работает ужасно медленно, хотя есть индексы по обеим полям и при этом возвращает лишние записи для 1, 12, 123, 2 вернёт 1, 12, а нужно 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2005, 16:22 |
|
||
|
как выбрать строки с которых начинаются другие строки?
|
|||
|---|---|---|---|
|
#18+
Oleg Luksha для 1, 12, 123, 2 вернёт 1, 12, а нужно 1 Не совсем понятно, что именно нужно. Если двухсимвольные строки не подходят, то почему бы не добавить условие length(r1.fsphone_prefix)=1 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2005, 16:59 |
|
||
|
как выбрать строки с которых начинаются другие строки?
|
|||
|---|---|---|---|
|
#18+
т.к. и 12 начинается с 1, и 123 начинается с 1 то надо вернуть 1, а то что 123 тоже начинается с 12 проигнорировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2005, 17:02 |
|
||
|
как выбрать строки с которых начинаются другие строки?
|
|||
|---|---|---|---|
|
#18+
Проще не получилось: create temp table regions_tq(Id serial, Phone_Prefix varchar(20)) with no log; insert into regions_tq(Phone_Prefix) values('1'); insert into regions_tq(Phone_Prefix) values('12'); insert into regions_tq(Phone_Prefix) values('123'); insert into regions_tq(Phone_Prefix) values('2'); select r1.phone_prefix from regions_tq r1 join regions_tq r2 on r2.Id <> r1.Id and r2.phone_prefix like r1.phone_prefix || '%' left join regions_tq r3 on r3.Id <> r1.Id and r1.phone_prefix like r3.phone_prefix || '%' where r3.Id is null group by r1.phone_prefix order by r1.phone_prefix ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2005, 18:17 |
|
||
|
как выбрать строки с которых начинаются другие строки?
|
|||
|---|---|---|---|
|
#18+
вот реальный запрос с планом. на 2500 записях выполнялся более 5 мин. сплошной перебор: QUERY: ------ select r1.fsphone_prefix from regions_tq r1 join regions_tq r2 on r2.firegion_Id <> r1.firegion_Id and r2.fsphone_prefix like r1.fsphone_prefix || '%' left join regions_tq r3 on r3.firegion_Id <> r1.firegion_Id and r1.fsphone_prefix like r3.fsphone_prefix || '%' where r3.firegion_Id is null group by r1.fsphone_prefix order by r1.fsphone_prefix Estimated Cost: 48047884 Estimated # of Rows Returned: 729 1) oper.r1: INDEX PATH (1) Index Keys: fsphone_prefix (Serial, fragments: ALL) 2) oper.r2: SEQUENTIAL SCAN ON-Filters:(oper.r2.firegion_id != oper.r1.firegion_id AND oper.r2.fsphone_prefix LIKE (oper.r1.fsphone_prefix || '%' )) NESTED LOOP JOIN 3) oper.r3: SEQUENTIAL SCAN ON-Filters:(oper.r3.firegion_id != oper.r1.firegion_id AND oper.r1.fsphone_prefix LIKE (oper.r3.fsphone_prefix || '%' )) NESTED LOOP JOIN(LEFT OUTER JOIN) PostJoin-Filters:oper.r3.firegion_id IS NULL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2005, 20:22 |
|
||
|
как выбрать строки с которых начинаются другие строки?
|
|||
|---|---|---|---|
|
#18+
Oleg Lukshaвот реальный запрос с планом. на 2500 записях выполнялся более 5 мин. сплошной перебор: Для ускорения попробуй переписать так: сначала во временную табличку получи рез-т работы прямого join (Там будут '1' и '12'). А потом удали из временной таблицы строки, удовлетворяющие условию для left join regions_tq r3 в запросе. Избавление от left join - первая задача в оптимизации запроса в большинстве случаев. ЗЫ Одним запросом - не вижу как решить оптимальнее, чем я раньше постил... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2005, 10:44 |
|
||
|
|

start [/forum/search_topic.php?author=DrMzi&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
get settings: |
6ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
37ms |
get topic data: |
7ms |
get first new msg: |
4ms |
get forum data: |
2ms |
get page messages: |
27ms |
get tp. blocked users: |
1ms |
| others: | 622ms |
| total: | 742ms |

| 0 / 0 |
