powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
25 сообщений из 54, страница 1 из 3
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39551734
Фотография Mikhail Tchervonenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброе время суток,

столкнулся с такой проблеммой:

есть запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT PC.POSTAL_CODE, AN2.GEONAMEID, AN3.NAME, AN3.ISOLANGUAGE, GN.LATITUDE, GN.LONGITUDE
           FROM ALTERNATENAME AN, ALTERNATENAME AN2 ,POSTAL_CODES PC,
           ALTERNATENAME AN3, GEONAME GN
           WHERE
           AN.NAME like 'Техт%'
           and AN2.GEONAMEID = AN.GEONAMEID
           and PC.NAME = AN2.NAME
           and AN3.GEONAMEID = AN2.GEONAMEID
           and GN.GEONAMEID = AN3.GEONAMEID
           and AN3.ISOLANGUAGE is not null
           and AN3.ISOLANGUAGE <> 'link'
           group by PC.POSTAL_CODE, AN2.GEONAMEID, AN3.NAME, AN3.ISOLANGUAGE, GN.LATITUDE, GN.LONGITUDE
           fetch first 500 row only


когда выполняю его отдельно все прекрасно и быстро и план как надо:
PLAN SORT (JOIN (AN INDEX (IDX_ALTERNATENAME_NA), AN3 INDEX (IDX_ALTERNATENAME_ID), AN2 INDEX (IDX_ALTERNATENAME_ID), PC INDEX (IDX_POSTAL_CODES_NA_PC), GN INDEX (PK_GEONAME_GEONAMEID)))

как только вставляю его в процедуру:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
for
       SELECT  PC.POSTAL_CODE, AN3.GEONAMEID, AN3.NAME, AN3.ISOLANGUAGE, GN.LATITUDE, GN.LONGITUDE
               FROM ALTERNATENAME AN, ALTERNATENAME AN2 ,POSTAL_CODES PC,
               ALTERNATENAME AN3, GEONAME GN
               WHERE
               AN.NAME like :I_NAME
               and AN2.GEONAMEID = AN.GEONAMEID
               and AN3.GEONAMEID = AN2.GEONAMEID
               and PC.POSTAL_CODE is not null
               and PC.NAME = AN2.NAME
               and AN3.ISOLANGUAGE is not null
               and AN3.ISOLANGUAGE <> 'link'
               and GN.GEONAMEID = AN3.GEONAMEID
               group by PC.POSTAL_CODE, AN3.GEONAMEID, AN3.NAME, AN3.ISOLANGUAGE, GN.LATITUDE, GN.LONGITUDE
               fetch first 500 row only
               into :O_POSTAL_CODE, :O_GEONAMEID, :O_NAME, :O_ISOLANGUAGE, :O_LATITUDE, :O_LONGITUDE
               do
               begin
                   suspend;
               end


всё съезжает набекрень, такое ощущение что оптимизация вообше не происходит, индексы вообше перестают использоваться.
Попробовал указать план явно:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
for
       SELECT  PC.POSTAL_CODE, AN3.GEONAMEID, AN3.NAME, AN3.ISOLANGUAGE, GN.LATITUDE, GN.LONGITUDE
               FROM ALTERNATENAME AN, ALTERNATENAME AN2 ,POSTAL_CODES PC,
               ALTERNATENAME AN3, GEONAME GN
               WHERE
               AN.NAME like :I_NAME
               and AN2.GEONAMEID = AN.GEONAMEID
               and AN3.GEONAMEID = AN2.GEONAMEID
               and PC.POSTAL_CODE is not null
               and PC.NAME = AN2.NAME
               and AN3.ISOLANGUAGE is not null
               and AN3.ISOLANGUAGE <> 'link'
               and GN.GEONAMEID = AN3.GEONAMEID
               group by PC.POSTAL_CODE, AN3.GEONAMEID, AN3.NAME, AN3.ISOLANGUAGE, GN.LATITUDE, GN.LONGITUDE
               PLAN SORT (JOIN (AN INDEX (IDX_ALTERNATENAME_NA), AN3 INDEX (IDX_ALTERNATENAME_ID), AN2 INDEX (IDX_ALTERNATENAME_ID), PC INDEX (IDX_POSTAL_CODES_NA_PC), GN INDEX (PK_GEONAME_GEONAMEID)))
               fetch first 500 row only
               into :O_POSTAL_CODE, :O_GEONAMEID, :O_NAME, :O_ISOLANGUAGE, :O_LATITUDE, :O_LONGITUDE
               do
               begin
                   suspend;
               end


получил ошибку компиляции:
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
Error while parsing procedure SEL_CITYANDPOSTCODES's BLR.
index IDX_ALTERNATENAME_NA cannot be used in the specified plan.

Почему вдруг индекс стал недоступен? куда рыть, почему снаружи всё нормально а в процедуре так?
есть мысли?
...
Рейтинг: 0 / 0
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39551742
Фотография Mikhail Tchervonenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail Tchervonenko,

вот структура таблиц ешё в догонку

ALTERNATENAME:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
/******************************************************************************/
/****              Generated by IBExpert 12.11.2017 15:22:05               ****/
/******************************************************************************/

/******************************************************************************/
/****     Following SET SQL DIALECT is just for the Database Comparer      ****/
/******************************************************************************/
SET SQL DIALECT 3;



/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/



CREATE TABLE ALTERNATENAME (
    ALTERNATENAMEID  DMN_INT_NOT_NULL NOT NULL /* DMN_INT_NOT_NULL = INTEGER NOT NULL */,
    GEONAMEID        DMN_INT_NOT_NULL /* DMN_INT_NOT_NULL = INTEGER NOT NULL */,
    ISOLANGUAGE      DMN_VCHAR_7_NULL /* DMN_VCHAR_7_NULL = VARCHAR(7) */,
    NAME             DMN_VCHAR_400_NULL /* DMN_VCHAR_400_NULL = VARCHAR(400) */,
    ISPREFERREDNAME  DMN_CHAR_1_NULL_ASCII /* DMN_CHAR_1_NULL_ASCII = CHAR(1) */,
    ISSHORTNAME      DMN_CHAR_1_NULL_ASCII /* DMN_CHAR_1_NULL_ASCII = CHAR(1) */,
    ISCOLLOQUIAL     DMN_CHAR_1_NULL_ASCII /* DMN_CHAR_1_NULL_ASCII = CHAR(1) */,
    ISHISTORIC       DMN_CHAR_1_NULL_ASCII /* DMN_CHAR_1_NULL_ASCII = CHAR(1) */
);




/******************************************************************************/
/****                             Primary keys                             ****/
/******************************************************************************/

ALTER TABLE ALTERNATENAME ADD CONSTRAINT PK_ALTERNATENAME PRIMARY KEY (ALTERNATENAMEID);


/******************************************************************************/
/****                             Foreign keys                             ****/
/******************************************************************************/

ALTER TABLE ALTERNATENAME ADD CONSTRAINT FK_ALTERNATENAME_ID FOREIGN KEY (GEONAMEID) REFERENCES GEONAME (GEONAMEID) ON DELETE CASCADE ON UPDATE CASCADE;


/******************************************************************************/
/****                               Indices                                ****/
/******************************************************************************/

CREATE INDEX IDX_ALTERNATENAME_ID ON ALTERNATENAME (GEONAMEID);
CREATE INDEX IDX_ALTERNATENAME_NA ON ALTERNATENAME (NAME);


/******************************************************************************/
/****                             Descriptions                             ****/
/******************************************************************************/

COMMENT ON TABLE ALTERNATENAME IS 
'ALTERNATENAMEID the id of this alternate name';



/******************************************************************************/
/****                         Fields descriptions                          ****/
/******************************************************************************/

COMMENT ON COLUMN ALTERNATENAME.GEONAMEID IS 
'GEONAMEID referring to id in table geoname';

COMMENT ON COLUMN ALTERNATENAME.ISOLANGUAGE IS 
'ISOLANGUAGE Alternate name of geographical point';

COMMENT ON COLUMN ALTERNATENAME.NAME IS 
'NAME Alternate name of geographical point';

COMMENT ON COLUMN ALTERNATENAME.ISPREFERREDNAME IS 
'ISPREFERREDNAME "1" - if this alternate name is an official/preferred name';

COMMENT ON COLUMN ALTERNATENAME.ISSHORTNAME IS 
'ISSHORTNAME "1" - if this is a short name like "California" for "State of California"';

COMMENT ON COLUMN ALTERNATENAME.ISCOLLOQUIAL IS 
'ISCOLLOQUIAL "1" - if this alternate name is a colloquial or slang term';

COMMENT ON COLUMN ALTERNATENAME.ISHISTORIC IS 
'ISHISTORIC "1" - if this alternate name is historic and was used in the past';



/******************************************************************************/
/****                              Privileges                              ****/
/******************************************************************************/


/* Privileges of roles */
GRANT ALL ON ALTERNATENAME TO ADMINISTRATORS;
GRANT SELECT ON ALTERNATENAME TO GASTS;
GRANT SELECT ON ALTERNATENAME TO MANAGERS;
GRANT SELECT ON ALTERNATENAME TO USERS;



POSTAL_CODES:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
/******************************************************************************/
/****              Generated by IBExpert 12.11.2017 15:23:54               ****/
/******************************************************************************/

/******************************************************************************/
/****     Following SET SQL DIALECT is just for the Database Comparer      ****/
/******************************************************************************/
SET SQL DIALECT 3;



/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/



CREATE TABLE POSTAL_CODES (
    COUNTRY_CODE  DMN_CHAR_2_NOT_NULL_ASCII NOT NULL /* DMN_CHAR_2_NOT_NULL_ASCII = CHAR(2) NOT NULL */,
    POSTAL_CODE   DMN_VCHAR_15_NOT_NULL NOT NULL /* DMN_VCHAR_15_NOT_NULL = VARCHAR(15) NOT NULL */,
    NAME          DMN_VCHAR_200_NOT_NULL NOT NULL /* DMN_VCHAR_200_NOT_NULL = VARCHAR(200) NOT NULL */,
    ADMIN_NAME1   DMN_VCHAR_100_NOT_NULL /* DMN_VCHAR_100_NOT_NULL = VARCHAR(100) NOT NULL */,
    CODE_NAME1    DMN_VCHAR_100_NULL /* DMN_VCHAR_100_NULL = VARCHAR(100) */,
    ADMIN_NAME2   DMN_VCHAR_100_NULL /* DMN_VCHAR_100_NULL = VARCHAR(100) */,
    CODE_NAME2    DMN_VCHAR_100_NULL /* DMN_VCHAR_100_NULL = VARCHAR(100) */,
    ADMIN_NAME3   DMN_VCHAR_100_NULL /* DMN_VCHAR_100_NULL = VARCHAR(100) */,
    CODE_NAME3    DMN_VCHAR_100_NULL /* DMN_VCHAR_100_NULL = VARCHAR(100) */,
    LATITUDE      DMN_DECIMAL_15_5 /* DMN_DECIMAL_15_5 = DECIMAL(15,5) */,
    LONGITUDE     DMN_DECIMAL_15_5 /* DMN_DECIMAL_15_5 = DECIMAL(15,5) */,
    ACCURACY      DMN_CHAR_2_NULL_ASCII /* DMN_CHAR_2_NULL_ASCII = CHAR(2) */
);




/******************************************************************************/
/****                             Primary keys                             ****/
/******************************************************************************/

ALTER TABLE POSTAL_CODES ADD CONSTRAINT PK_POSTAL_CODES PRIMARY KEY (POSTAL_CODE, NAME, COUNTRY_CODE);


/******************************************************************************/
/****                               Indices                                ****/
/******************************************************************************/

CREATE INDEX IDX_POSTAL_CODES_NA_PC ON POSTAL_CODES (NAME, POSTAL_CODE);


/******************************************************************************/
/****                             Descriptions                             ****/
/******************************************************************************/

COMMENT ON TABLE POSTAL_CODES IS 
'COUNTRY_CODE ISO-3166 2-letter country code';



/******************************************************************************/
/****                         Fields descriptions                          ****/
/******************************************************************************/

COMMENT ON COLUMN POSTAL_CODES.POSTAL_CODE IS 
'POSTAL_CODE';

COMMENT ON COLUMN POSTAL_CODES.NAME IS 
'NAME - name of geographical point';

COMMENT ON COLUMN POSTAL_CODES.ADMIN_NAME1 IS 
'ADMIN_NAME1';

COMMENT ON COLUMN POSTAL_CODES.CODE_NAME1 IS 
'CODE_NAME1';

COMMENT ON COLUMN POSTAL_CODES.ADMIN_NAME2 IS 
'ADMIN_NAME2';

COMMENT ON COLUMN POSTAL_CODES.CODE_NAME2 IS 
'CODE_NAME2';

COMMENT ON COLUMN POSTAL_CODES.ADMIN_NAME3 IS 
'ADMIN_NAME3';

COMMENT ON COLUMN POSTAL_CODES.CODE_NAME3 IS 
'CODE_NAME3';

COMMENT ON COLUMN POSTAL_CODES.LATITUDE IS 
'LATITUDE';

COMMENT ON COLUMN POSTAL_CODES.LONGITUDE IS 
'LONGITUDE';

COMMENT ON COLUMN POSTAL_CODES.ACCURACY IS 
'ACCURACY';



/******************************************************************************/
/****                              Privileges                              ****/
/******************************************************************************/


/* Privileges of roles */
GRANT ALL ON POSTAL_CODES TO ADMINISTRATORS;
GRANT SELECT ON POSTAL_CODES TO GASTS;
GRANT SELECT ON POSTAL_CODES TO MANAGERS;
GRANT SELECT ON POSTAL_CODES TO USERS;



GEONAME:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
/******************************************************************************/
/****              Generated by IBExpert 12.11.2017 15:24:32               ****/
/******************************************************************************/

/******************************************************************************/
/****     Following SET SQL DIALECT is just for the Database Comparer      ****/
/******************************************************************************/
SET SQL DIALECT 3;



/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/



CREATE TABLE GEONAME (
    GEONAMEID          DMN_INT_NOT_NULL NOT NULL /* DMN_INT_NOT_NULL = INTEGER NOT NULL */,
    NAME               DMN_VCHAR_200_NULL /* DMN_VCHAR_200_NULL = VARCHAR(200) */,
    ASCIINAME          DMN_VCHAR_200_NULL /* DMN_VCHAR_200_NULL = VARCHAR(200) */,
    LATITUDE           DMN_DECIMAL_15_5 /* DMN_DECIMAL_15_5 = DECIMAL(15,5) */,
    LONGITUDE          DMN_DECIMAL_15_5 /* DMN_DECIMAL_15_5 = DECIMAL(15,5) */,
    FEATURE_CLASS      DMN_CHAR_1_NULL_ASCII /* DMN_CHAR_1_NULL_ASCII = CHAR(1) */,
    FEATURE_CODE       DMN_VARCHAR_10_NULL_ASCII /* DMN_VARCHAR_10_NULL_ASCII = VARCHAR(10) */,
    COUNTRY_CODE       DMN_CHAR_2_NULL_ASCII /* DMN_CHAR_2_NULL_ASCII = CHAR(2) */,
    CC2                DMN_VCHAR_200_NULL /* DMN_VCHAR_200_NULL = VARCHAR(200) */,
    ADMIN1_CODE        DMN_VCHAR_20_NULL /* DMN_VCHAR_20_NULL = VARCHAR(20) */,
    ADMIN2_CODE        DMN_VCHAR_100_NULL /* DMN_VCHAR_100_NULL = VARCHAR(100) */,
    ADMIN3_CODE        DMN_VCHAR_20_NULL /* DMN_VCHAR_20_NULL = VARCHAR(20) */,
    ADMIN4_CODE        DMN_VCHAR_20_NULL /* DMN_VCHAR_20_NULL = VARCHAR(20) */,
    POPULATION         DMN_BIGINT_NULL /* DMN_BIGINT_NULL = BIGINT */,
    ELEVATION          DMN_INT_NULL /* DMN_INT_NULL = INTEGER */,
    DEM                DMN_INT_NULL /* DMN_INT_NULL = INTEGER */,
    TIMEZONE           DMN_VCHAR_50_NULL /* DMN_VCHAR_50_NULL = VARCHAR(50) */,
    MODIFICATION_DATE  DMN_DATE_NULL /* DMN_DATE_NULL = DATE */,
    PLACE_NAME         DMN_VCHAR_200_NULL /* DMN_VCHAR_200_NULL = VARCHAR(200) */
);




/******************************************************************************/
/****                             Primary keys                             ****/
/******************************************************************************/

ALTER TABLE GEONAME ADD CONSTRAINT PK_GEONAME_GEONAMEID PRIMARY KEY (GEONAMEID);


/******************************************************************************/
/****                             Descriptions                             ****/
/******************************************************************************/

COMMENT ON TABLE GEONAME IS 
'GEONAMEID PK';



/******************************************************************************/
/****                         Fields descriptions                          ****/
/******************************************************************************/

COMMENT ON COLUMN GEONAME.NAME IS 
'NAME name of geographical point';

COMMENT ON COLUMN GEONAME.ASCIINAME IS 
'ASCIINAME name of geographical point in plain ascii characters';

COMMENT ON COLUMN GEONAME.LATITUDE IS 
'LATITUDE latitude in decimal degrees (wgs84)';

COMMENT ON COLUMN GEONAME.LONGITUDE IS 
'LONGITUDE longitude in decimal degrees (wgs84)';

COMMENT ON COLUMN GEONAME.FEATURE_CLASS IS 
'FEATURE_CLASS see http://www.geonames.org/export/codes.html';

COMMENT ON COLUMN GEONAME.FEATURE_CODE IS 
'FEATURE_CODE see http://www.geonames.org/export/codes.html';

COMMENT ON COLUMN GEONAME.COUNTRY_CODE IS 
'COUNTRY_CODE ISO-3166 2-letter country code';

COMMENT ON COLUMN GEONAME.CC2 IS 
'CC2 alternate country codes, comma separated, ISO-3166 2-letter country code';

COMMENT ON COLUMN GEONAME.ADMIN1_CODE IS 
'ADMIN1_CODE fipscode (subject to change to iso code), see exceptions below, see file admin1Codes.txt for display names of this code';

COMMENT ON COLUMN GEONAME.ADMIN2_CODE IS 
'ADMIN2_CODE code for the second administrative division, a county in the US, see file admin2Codes.txt';

COMMENT ON COLUMN GEONAME.ADMIN3_CODE IS 
'ADMIN3_CODE code for third level administrative division';

COMMENT ON COLUMN GEONAME.ADMIN4_CODE IS 
'ADMIN4_CODE code for fourth level administrative division';

COMMENT ON COLUMN GEONAME.POPULATION IS 
'POPULATION Population';

COMMENT ON COLUMN GEONAME.ELEVATION IS 
'ELEVATION in meters';

COMMENT ON COLUMN GEONAME.DEM IS 
'ELEVATION digital elevation model, srtm3 or gtopo30, average elevation of 3''x3'' (ca 90mx90m) or 30''x30'' (ca 900mx900m) area in meters, integer. srtm processed by cgiar/ciat';

COMMENT ON COLUMN GEONAME.TIMEZONE IS 
'TIMEZONE the timezone id (see file timeZone.txt)';

COMMENT ON COLUMN GEONAME.MODIFICATION_DATE IS 
'MODIFICATION_DATE date of last modification in yyyy-MM-dd format';

COMMENT ON COLUMN GEONAME.PLACE_NAME IS 
'PLACE_NAME name of geographical point';



/******************************************************************************/
/****                              Privileges                              ****/
/******************************************************************************/


/* Privileges of roles */
GRANT ALL ON GEONAME TO ADMINISTRATORS;
GRANT SELECT ON GEONAME TO GASTS;
GRANT SELECT ON GEONAME TO MANAGERS;
GRANT SELECT ON GEONAME TO USERS;

...
Рейтинг: 0 / 0
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39551748
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail Tchervonenko,

разве это одинаковые запросы?
Код: sql
1.
AN.NAME like 'Техт%'


и
Код: sql
1.
AN.NAME like :I_NAME


И во втором запросе под where - 8 условий, в первом - 7.
...
Рейтинг: 0 / 0
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39551803
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail Tchervonenko,

если запросы одинаковые, то разницы в планах отдельно и в процедуре быть не может.
кроме того, тут plan sort, так что выполнение должно быть одинаково, разница только в фетчах может быть. В смысле, в выборке записей.
...
Рейтинг: 0 / 0
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39551810
Фотография Mikhail Tchervonenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДMikhail Tchervonenko,

разве это одинаковые запросы?
Код: sql
1.
AN.NAME like 'Техт%'



и
Код: sql
1.
AN.NAME like :I_NAME



И во втором запросе под where - 8 условий, в первом - 7.

восьмое условие это я уже эксперементировал (and PC.POSTAL_CODE is not null). Если его убрать ситуация не меняется.

а если с I_NAME передать строку 'Техт%' то по Вашему это другои запрос?
...
Рейтинг: 0 / 0
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39551811
Фотография Mikhail Tchervonenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvMikhail Tchervonenko,

если запросы одинаковые, то разницы в планах отдельно и в процедуре быть не может.
кроме того, тут plan sort, так что выполнение должно быть одинаково, разница только в фетчах может быть. В смысле, в выборке записей.

я тоже так всегда считал, но походу нет. Там кроме SORT ешё JOIN внутри.
...
Рейтинг: 0 / 0
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39551823
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail Tchervonenkoа если с I_NAME передать строку 'Техт%' то по Вашему это другой запрос?
для оптимизатора - другой
...
Рейтинг: 0 / 0
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39551826
Фотография Mikhail Tchervonenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrMikhail Tchervonenkoа если с I_NAME передать строку 'Техт%' то по Вашему это другой запрос?
для оптимизатора - другой

есть способ это обойти?
и почему не даёт указать план (точнее использовать определьнный индекс, который снаружи работает без проблем)?
...
Рейтинг: 0 / 0
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39551839
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail Tchervonenkoесть способ это обойти?

Используй STARTING WITH.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39551884
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail TchervonenkoчччДMikhail Tchervonenko,

разве это одинаковые запросы?
Код: sql
1.
AN.NAME like 'Техт%'



и
Код: sql
1.
AN.NAME like :I_NAME



И во втором запросе под where - 8 условий, в первом - 7.

восьмое условие это я уже эксперементировал (and PC.POSTAL_CODE is not null). Если его убрать ситуация не меняется.

а если с I_NAME передать строку 'Техт%' то по Вашему это другои запрос?

ну ты вопрос задаешь, утверждаешь, что запросы одинаковые, а они разные. Как догадаться, что ты "экспериментировал" и т.п.?
...
Рейтинг: 0 / 0
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39551888
Фотография Mikhail Tchervonenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMikhail Tchervonenkoесть способ это обойти?

Используй STARTING WITH.

не помогло
...
Рейтинг: 0 / 0
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39551890
Фотография Mikhail Tchervonenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
непонятно как с этим бороться,
проверил, в одной и той-же процедуре запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
   for
       SELECT  PC.POSTAL_CODE, AN2.GEONAMEID, AN3.NAME, AN3.ISOLANGUAGE, GN.LATITUDE, GN.LONGITUDE
               FROM ALTERNATENAME AN, ALTERNATENAME AN2 ,POSTAL_CODES PC,
               ALTERNATENAME AN3, GEONAME GN
               WHERE
               AN.NAME STARTING WITH :I_NAME
               and AN2.GEONAMEID = AN.GEONAMEID
               and PC.NAME = AN2.NAME
               and AN3.GEONAMEID = AN2.GEONAMEID
               and GN.GEONAMEID = AN3.GEONAMEID
               and AN3.ISOLANGUAGE is not null
               and AN3.ISOLANGUAGE <> 'link'
               group by PC.POSTAL_CODE, AN2.GEONAMEID, AN3.NAME, AN3.ISOLANGUAGE, GN.LATITUDE, GN.LONGITUDE
               fetch first :I_LIMIT row only
               into :O_POSTAL_CODE, :O_GEONAMEID, :O_NAME, :O_ISOLANGUAGE, :O_LATITUDE, :O_LONGITUDE
               do
               begin
                   suspend;
               end


выполняется 56 минут

а запрос где заменил парамерт I_NAME просто на строку
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
   for
       SELECT  PC.POSTAL_CODE, AN2.GEONAMEID, AN3.NAME, AN3.ISOLANGUAGE, GN.LATITUDE, GN.LONGITUDE
               FROM ALTERNATENAME AN, ALTERNATENAME AN2 ,POSTAL_CODES PC,
               ALTERNATENAME AN3, GEONAME GN
               WHERE
               AN.NAME STARTING WITH 'Text'
               and AN2.GEONAMEID = AN.GEONAMEID
               and PC.NAME = AN2.NAME
               and AN3.GEONAMEID = AN2.GEONAMEID
               and GN.GEONAMEID = AN3.GEONAMEID
               and AN3.ISOLANGUAGE is not null
               and AN3.ISOLANGUAGE <> 'link'
               group by PC.POSTAL_CODE, AN2.GEONAMEID, AN3.NAME, AN3.ISOLANGUAGE, GN.LATITUDE, GN.LONGITUDE
               fetch first :I_LIMIT row only
               into :O_POSTAL_CODE, :O_GEONAMEID, :O_NAME, :O_ISOLANGUAGE, :O_LATITUDE, :O_LONGITUDE
               do
               begin
                   suspend;
               end


16 миллисекунд

замена like на STARTING WITH сушественно ничего не изменила.
...
Рейтинг: 0 / 0
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39551895
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail Tchervonenkoнепонятно как с этим бороться

Читать http://www.ibase.ru/dataaccesspaths/ до просветления.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39551966
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail Tchervonenkoя тоже так всегда считал, но походу нет. Там кроме SORT ешё JOIN внутри.
во-первых, все-таки разные, а во-вторых, снаружи SORT, и похер, что там внутри. Результат будет отсортирован через память-временный файл, и выдан клиенту.
Вот если бы снаружи был table ORDER index, то ...
...
Рейтинг: 0 / 0
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39551978
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail Tchervonenkoзамена like на STARTING WITH существенно ничего не изменила
не верю (с) Что-то наверняка упускается или умалчивается.
...
Рейтинг: 0 / 0
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39551982
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так бесполезно гадать, ни планов, ни примера.
Михаил, выцепи свой DDL в воспроизводимый
пример и выкладывай сюда.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39551985
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail Tchervonenko,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
FOR
  SELECT
      PC.POSTAL_CODE,
      AN2.GEONAMEID,
      AN3.NAME,
      AN3.ISOLANGUAGE,
      GN.LATITUDE,
      GN.LONGITUDE
  FROM
      GEONAME GN
      JOIN ALTERNATENAME AN ON AN.GEONAMEID = GN.GEONAMEID
      JOIN ALTERNATENAME AN2 ON AN2.GEONAMEID = GN.GEONAMEID
      JOIN ALTERNATENAME AN3 ON  AN3.GEONAMEID = GN.GEONAMEID
      JOIN POSTAL_CODES PC ON PC.NAME = AN2.NAME
  WHERE AN.NAME STARTING WITH 'Text'
    AND AN3.ISOLANGUAGE IS NOT NULL
    AND AN3.ISOLANGUAGE <> 'link'
  GROUP BY PC.POSTAL_CODE, AN2.GEONAMEID, AN3.NAME, AN3.ISOLANGUAGE, GN.LATITUDE, GN.LONGITUDE
  FETCH FIRST :I_LIMIT ROW ONLY  
  INTO :O_POSTAL_CODE, :O_GEONAMEID, :O_NAME, :O_ISOLANGUAGE, :O_LATITUDE, :O_LONGITUDE
DO
BEGIN
  SUSPEND;
END



ИХМО так запрос понятней и ошибку искать проще
...
Рейтинг: 0 / 0
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39552025
Евгений Килин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail Tchervonenkoпроверил, в одной и той-же процедуре запрос:
выполняется 56 минут

а запрос где заменил парамерт I_NAME просто на строку
16 миллисекунд

А в процедуре тип у параметра I_NAME какой указываешь?
...
Рейтинг: 0 / 0
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39552058
Фотография Mikhail Tchervonenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений КилинА в процедуре тип у параметра I_NAME какой указываешь?

I_NAME type of column ALTERNATENAME.NAME

вот последний вариант процедуры
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
create or alter procedure SEL_CITYANDPOSTCODES (
    I_LANG type of column GEONAME.COUNTRY_CODE,
    I_POSTAL_CODE type of column POSTAL_CODES.POSTAL_CODE,
    I_NAME type of column ALTERNATENAME.NAME,
    I_LIMIT integer default 500)
returns (
    O_GEONAMEID type of column GEONAME.GEONAMEID,
    O_LANG type of column GEONAME.COUNTRY_CODE,
    O_POSTAL_CODE type of column POSTAL_CODES.POSTAL_CODE,
    O_NAME type of column ALTERNATENAME.NAME,
    O_ISOLANGUAGE type of column ALTERNATENAME.ISOLANGUAGE,
    O_LATITUDE type of column GEONAME.LATITUDE,
    O_LONGITUDE type of column GEONAME.LONGITUDE)
AS
begin
   O_LANG = I_LANG;

   if (I_POSTAL_CODE is not null and (Trim(I_POSTAL_CODE) = '')) then
       I_POSTAL_CODE = null;

   if (I_NAME is not null and (Trim(I_NAME) = '')) then
       I_NAME = null;

   for
       SELECT  PC.POSTAL_CODE, AN2.GEONAMEID, AN3.NAME, AN3.ISOLANGUAGE, GN.LATITUDE, GN.LONGITUDE
               FROM ALTERNATENAME AN, ALTERNATENAME AN2 ,POSTAL_CODES PC,
               ALTERNATENAME AN3, GEONAME GN
               WHERE
               AN2.GEONAMEID = AN.GEONAMEID
               and (:I_NAME is null or (AN.NAME STARTING WITH :I_NAME))
               and (:I_POSTAL_CODE is null or (PC.POSTAL_CODE STARTING WITH :I_POSTAL_CODE))
               and PC.NAME = AN2.NAME
               and AN3.GEONAMEID = AN2.GEONAMEID
               and GN.GEONAMEID = AN3.GEONAMEID
               and AN3.ISOLANGUAGE is not null
               and AN3.ISOLANGUAGE <> 'link'
               group by PC.POSTAL_CODE, AN2.GEONAMEID, AN3.NAME, AN3.ISOLANGUAGE, GN.LATITUDE, GN.LONGITUDE
               fetch first :I_LIMIT row only
               into :O_POSTAL_CODE, :O_GEONAMEID, :O_NAME, :O_ISOLANGUAGE, :O_LATITUDE, :O_LONGITUDE
               do
               begin
                   suspend;
               end
 
end^

...
Рейтинг: 0 / 0
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39552067
Фотография Mikhail Tchervonenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
причем тормозит только этот вызов:
select * from SEL_CITYANDPOSTCODES('RU',null,'Толь')

эти 2 более менее в 16-30 миллисекунд укладываются (хотя индекс от POSTAL_CODE игнорируют почему то)
select * from SEL_CITYANDPOSTCODES('RU','445',null)
select * from SEL_CITYANDPOSTCODES('RU','445','Толь')
...
Рейтинг: 0 / 0
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39552078
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail Tchervonenko> причем тормозит только этот вызов:
> select * from SEL_CITYANDPOSTCODES('RU',null,'Толь')
>
> эти 2 более менее в 16-30 миллисекунд укладываются
> select * from SEL_CITYANDPOSTCODES('RU','445','Толь')

Ну очевидна же разница. Попробуй этот же
запрос без ХП, но с теми же параметрами.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39552083
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вообще, если оно у тебя Not Null - нафига все эти пляски с бубном
и проверками? Тупо передавай в параметр пустую строку и всё.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39552086
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тю, у тебя и Name Not Null (что логично и неудивительно).
Нафига вообще эта ХП (только чтобы отовсюду дергать
её, а не запрос тиражировать) ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39552093
Фотография Mikhail Tchervonenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

спасибо за идею, после явного указания Join нов все заработало как надо
от and (:I_NAME is null or (AN.NAME STARTING WITH :I_NAME))
тоже пришлось отказаться, почему то это тоже мешало (в FB 2.5 такое прокатывало вроде)

вот последний рабочий вариант в котором заработали планы и индексы как ожидалось:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
create or alter procedure SEL_CITYANDPOSTCODES (
    I_LANG type of column GEONAME.COUNTRY_CODE,
    I_POSTAL_CODE type of column POSTAL_CODES.POSTAL_CODE,
    I_NAME type of column ALTERNATENAME.NAME,
    I_LIMIT integer default 500)
returns (
    O_GEONAMEID type of column GEONAME.GEONAMEID,
    O_LANG type of column GEONAME.COUNTRY_CODE,
    O_POSTAL_CODE type of column POSTAL_CODES.POSTAL_CODE,
    O_NAME type of column ALTERNATENAME.NAME,
    O_ISOLANGUAGE type of column ALTERNATENAME.ISOLANGUAGE,
    O_LATITUDE type of column GEONAME.LATITUDE,
    O_LONGITUDE type of column GEONAME.LONGITUDE)
AS
begin
   O_LANG = I_LANG;

   if (I_POSTAL_CODE is not null and (Trim(I_POSTAL_CODE) = '')) then
       I_POSTAL_CODE = null;

   if (I_NAME is not null and (Trim(I_NAME) = '')) then
       I_NAME = null;

   if (I_POSTAL_CODE is null and I_NAME is not null) then -- NAME
   begin
       --PLAN SORT (JOIN (AN INDEX (IDX_ALTERNATENAME_NA), AN3 INDEX (IDX_ALTERNATENAME_ID), AN2 INDEX (IDX_ALTERNATENAME_ID), PC INDEX (IDX_POSTAL_CODES_NA_PC), GN INDEX (PK_GEONAME_GEONAMEID)))
            FOR
              SELECT
                  PC.POSTAL_CODE,
                  AN2.GEONAMEID,
                  AN3.NAME,
                  AN3.ISOLANGUAGE,
                  GN.LATITUDE,
                  GN.LONGITUDE
              FROM
                  GEONAME GN
                  JOIN ALTERNATENAME AN ON AN.GEONAMEID = GN.GEONAMEID
                  JOIN ALTERNATENAME AN2 ON AN2.GEONAMEID = GN.GEONAMEID
                  JOIN ALTERNATENAME AN3 ON  AN3.GEONAMEID = GN.GEONAMEID
                  JOIN POSTAL_CODES PC ON PC.NAME = AN2.NAME
              WHERE
                AN.NAME STARTING WITH :I_NAME
                AND AN3.ISOLANGUAGE IS NOT NULL
                AND AN3.ISOLANGUAGE <> 'link'
              GROUP BY PC.POSTAL_CODE, AN2.GEONAMEID, AN3.NAME, AN3.ISOLANGUAGE, GN.LATITUDE, GN.LONGITUDE
              FETCH FIRST :I_LIMIT ROW ONLY  
              INTO :O_POSTAL_CODE, :O_GEONAMEID, :O_NAME, :O_ISOLANGUAGE, :O_LATITUDE, :O_LONGITUDE
            DO
            BEGIN
              SUSPEND;
            END
    end
    else if (I_POSTAL_CODE is not null and I_NAME is null) then  -- POSTAL_CODE
    begin
    --PLAN SORT (JOIN (PC INDEX (PK_POSTAL_CODES), AN2 INDEX (IDX_ALTERNATENAME_NA), AN3 INDEX (IDX_ALTERNATENAME_ID), AN INDEX (IDX_ALTERNATENAME_ID), GN INDEX (PK_GEONAME_GEONAMEID)))
            FOR
              SELECT
                  PC.POSTAL_CODE,
                  AN2.GEONAMEID,
                  AN3.NAME,
                  AN3.ISOLANGUAGE,
                  GN.LATITUDE,
                  GN.LONGITUDE
              FROM
                  GEONAME GN
                  JOIN ALTERNATENAME AN ON AN.GEONAMEID = GN.GEONAMEID
                  JOIN ALTERNATENAME AN2 ON AN2.GEONAMEID = GN.GEONAMEID
                  JOIN ALTERNATENAME AN3 ON  AN3.GEONAMEID = GN.GEONAMEID
                  JOIN POSTAL_CODES PC ON PC.NAME = AN2.NAME
              WHERE
                PC.POSTAL_CODE STARTING WITH :I_POSTAL_CODE
                AND AN3.ISOLANGUAGE IS NOT NULL
                AND AN3.ISOLANGUAGE <> 'link'
              GROUP BY PC.POSTAL_CODE, AN2.GEONAMEID, AN3.NAME, AN3.ISOLANGUAGE, GN.LATITUDE, GN.LONGITUDE
              FETCH FIRST :I_LIMIT ROW ONLY  
              INTO :O_POSTAL_CODE, :O_GEONAMEID, :O_NAME, :O_ISOLANGUAGE, :O_LATITUDE, :O_LONGITUDE
            DO
            BEGIN
              SUSPEND;
            END
    end
    else if (I_POSTAL_CODE is not null and I_NAME is not null) then  -- POSTAL_CODE and NAME
    begin
       --PLAN SORT (JOIN (PC INDEX (PK_POSTAL_CODES), AN2 INDEX (IDX_ALTERNATENAME_NA), AN INDEX (IDX_ALTERNATENAME_ID), AN3 INDEX (IDX_ALTERNATENAME_ID), GN INDEX (PK_GEONAME_GEONAMEID)))
            FOR
              SELECT
                  PC.POSTAL_CODE,
                  AN2.GEONAMEID,
                  AN3.NAME,
                  AN3.ISOLANGUAGE,
                  GN.LATITUDE,
                  GN.LONGITUDE
              FROM
                  GEONAME GN
                  JOIN ALTERNATENAME AN ON AN.GEONAMEID = GN.GEONAMEID
                  JOIN ALTERNATENAME AN2 ON AN2.GEONAMEID = GN.GEONAMEID
                  JOIN ALTERNATENAME AN3 ON  AN3.GEONAMEID = GN.GEONAMEID
                  JOIN POSTAL_CODES PC ON PC.NAME = AN2.NAME
              WHERE
                AN.NAME STARTING WITH :I_NAME
                and
                PC.POSTAL_CODE STARTING WITH :I_POSTAL_CODE
                AND AN3.ISOLANGUAGE IS NOT NULL
                AND AN3.ISOLANGUAGE <> 'link'
              GROUP BY PC.POSTAL_CODE, AN2.GEONAMEID, AN3.NAME, AN3.ISOLANGUAGE, GN.LATITUDE, GN.LONGITUDE
              FETCH FIRST :I_LIMIT ROW ONLY  
              INTO :O_POSTAL_CODE, :O_GEONAMEID, :O_NAME, :O_ISOLANGUAGE, :O_LATITUDE, :O_LONGITUDE
            DO
            BEGIN
              SUSPEND;
            END
    end

end^

...
Рейтинг: 0 / 0
FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
    #39552096
Фотография Mikhail Tchervonenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамТю, у тебя и Name Not Null (что логично и неудивительно).
Нафига вообще эта ХП (только чтобы отовсюду дергать
её, а не запрос тиражировать) ?

это не окончательный вариант, там ещё логика на гео координаты и языки будет.
...
Рейтинг: 0 / 0
25 сообщений из 54, страница 1 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FB3 Разная работа оптимизатора одного и того же запроса в процедуре и вне её
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]