Переключение на Главную Страницу Страницы: 1 ... 3 4 [5] 6 7 ... 20 ОтправитьПечать
Очень популярная тема (более 25 ответов) 1sqlite (число прочтений - 64554 )
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #60 - 25. Октября 2007 :: 19:38
Печать  
kiruha
Нет, случай маловероятный, но не экзотический.
Неуникальный ID в уникальном поле - это нарушение идеологии системы, имеем полное право считать такую ситуацию недопустимой, а замещение записей - ситуация штатная, прогнозируемая.

Uzhast
Цитата:
Поиск по CompareRows дает следующие места, где используется сравнение:

То же самое касается GetRowValue и преобразования CDataRow в CValue.
Предположим, мы стоим на строке, которую удаляют и замещают другой на том же месте.
В тот момент, когда мы нажмем Enter для ключа "x y z ID" мы получим ошибку позиционирования (если ID стал другим и не возродился в другом месте).
Для ключа "x y z rec_no" мы найдем строку (если x y z остались теми же), которая будет совпадать по ключу, но не будет соответствовать ожиданию пользователя.

P.S.
Конечно, согласен, что ситуация редкая.
Это примерно как с нюансами нехватки памяти, или обработки исключений.
Более того, если даже что-то произойдет, это будет практически неповторяемо; скорее всего, пользователь даже не поймет, что и откуда прилетело.

Засим умолкаю...
В мою задачу совсем не входит деморализовать отличные идеи быстрого позиционирования в DBF.
Мне просто приятно поговорить с умными людьми Улыбка

...
Но если будет нормальный выбор, лучше делать надежное решение. Улыбка
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #61 - 25. Октября 2007 :: 19:50
Печать  
kms писал(а) 25. Октября 2007 :: 19:38:
То же самое касается GetRowValue и преобразования CDataRow в CValue.
Предположим, мы стоим на строке, которую удаляют и замещают другой на том же месте.
В тот момент, когда мы нажмем Enter для ключа "x y z ID" мы получим ошибку позиционирования (если ID стал другим и не возродился в другом месте).
Для ключа "x y z rec_no" мы найдем строку (если x y z остались теми же), которая будет совпадать по ключу, но не будет соответствовать ожиданию пользователя.

Неправда! Улыбка Я уже говорил, что в качестве внутреннего ключа используется номер записи. А в качестве ключа для ТП используется нормальная колонка типа "Документ" или "Справочник". Поэтому, если юзверь шваркнет на Enter на удаленном элементе, то он получит ожидаемую (по крайней мере, для программиста) реакцию: "Объект не найден и т.д." Соответственно преобразование ТП-ключа в значение - тоже берется агрегатный объект и по нему ищем строку. Естественно, не находим и материм юзверя, чтобы отвязался. Поэтому, проблем с использованием номера строки не так уж и много получается. Но тут надо думать, конечно...
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #62 - 25. Октября 2007 :: 20:23
Печать  
orefkov писал(а) 20. Октября 2007 :: 04:52:
- Пытается использовать индексы при работе с таблицами 1С.
  Вот это надо особо протестить.

1. Вот так можно уронить:

select * from Номенклатура
where PARENTID_ISFOLDER_DESCR = 1
order by PARENTID_ISFOLDER_DESCR


2. case sensitivity для русских названий индексов

select * from Номенклатура
order by PARENTID_ISFOLDER_Артикул -- работает

select * from Номенклатура
order by PARENTID_ISFOLDER_АртикуЛ -- нет


3. Не возникло взаимопонимания при установке фильтров

select * from Номенклатура
where parentid = '     0   '

Дает пустой запрос, хотя корневые элементы, конечно, есть.

При этом в плане запроса
Код
Выбрать все
5	VFilter	0	49	SC84.PCODE;?0;
 


имя индекса подходящее, но непонятно что означает ?0
в число преобразует?

4. Вот такой запрос

select * from Номенклатура
where parentid = '     0   '
and isfolder = 1
and descr > 'У'


в плане запроса дает
Код
Выбрать все
6	VFilter	0	53	SC84.PCODE;?0;1;
7	VColumn	0	3
8	String8	0	0	У
9	Le	353	52	collseq(BINARY)
 


верно ли это (ожидаемо было бы получить индекс PDESCR)
  

De quelle planète es-tu?
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #63 - 26. Октября 2007 :: 05:30
Печать  
Извиняюсь, провайдер лишал интернета.
2kms: Ну, наконец-то пошло что-то ближе к теме.
Часть глюков уже сам вчера обнаружил. Правлю.
Надеюсь, к вечеру будет обновленная версия.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #64 - 26. Октября 2007 :: 06:12
Печать  
Теперь Uzhast.
Цитата:
Если у тебя возможность использования ТОЛЬКО SQL-запроса, то не получится. Но ты же имеешь прямой доступ к таблице 1С. Значит, у тебя есть возможность доступа к физическому номеру записи. Так что все выглядит просто:
1) Выбираем N строк с учетом упорядочивания. Для каждой строки запоминаем физический номер.
2) Когда ТП просит M строк с нужной строки, упорядочиваем записи, используя упорядочивающее выражение.
3) Переходим по физическому номеру записи к нужной.
4) Переходим к следующей/предыдущей записи в зависимости от того, в каком направлении двигаемся.
5) Выбираем M строк в нужном направлении.


Ты этот свой "простой" алгоритм кроме своей головы еще гденить пробовал тестить?
У тебя п.2 и п.3 противоречят друг-другу.
Если ты используешь индекс для упорядочивания, то перейти по физическому номеру записи невозможно.
Кроме как full-scan'ом.
Так-что возможный алгоритм мог бы быть такой (для случая выборки следующих строк) :
1. Делаем index seek по ключу.
2. Сканируем по индексу дальше, ища запись с нужным физическим номером.
3. Получаем следующие записи.

Однако этот алгоритм неверен. Во-первых, ключ этой записи уже мог изменится.
(Другой юзер уже переименовал, удалил, перенес в другую группу)
В лучшем случае новый ключ записи больше старого, и рано или поздно, двигаясь
по индкесу, мы до нее дойдем. В худшем - новый ключ меньше, либо отсутствует.
В этом случае вообще ничего не найдем.

Во-вторых, ТП работает не так, как ты себе представляешь - оно не просит
провайдера "получи М строк от текущей записи".
Оно просит "получи первые М строк с ключом БОЛЬШИМ, чем вот этот сохраненный ключ"
Так вот в этом случае, если бы я точно был уверен, что одинаковые ключи в индексе
расположены СТРОГО по порядку номеров физических записей, алгоритм был бы таким:
1. Делаем index seek по переданному ключу.
2. Двигаемся по индексу далее, пока (номер записи меньше переданного и ключ не больше переданного).
3. Как только это условие не выполняется, получаем М строк.

Вот поэтому я и спрашивал, упорядочиваются ли дублирующиеся ключи в индексе ещё и
по физическим номерам записей.

Цитата:
Вообще, ИМХО, страсть использовать SQL-запросы для построения курсоров - пагубная.
Для курсоров лучше использовать XBase-подобные средства.
А SQL-запросы в подобных задачах наоборот, вместо наглядности и простоты выборки данных,
дают усложения и лишние тормоза на ровном месте.


Ща я тебе покажу, какая это гадость - курсоры.
Проведем экперимент:
1. Открываем две копии 1С с одной базой, хоть дбф, хоть sql.
2. Открываем в ней форму списка большого справочника.
3. В обоих базах ставим время автообновления 99, и встаем на один и тот же элемент справочника
   примерно в середине списка, где-то например, на букве "К".
4. В одной копии меняем название элемента, например, первую букву заменяем на "П".
5. В другой - пытаемся походить вверх/вниз от текущего элемента. Внимательно наблюдаем
   за интересными артефактами.
6. Закроем/откроем справочник.
7. Опять встаем на один и тот-же элемент.
8. В одной программе переносим элемент в другую группу.
9. В другой пытаемся  походить вверх/вниз от текущего элемента. И не можем этого сделать.

Вот так вот работают курсоры.
И как раз из-за того, что пляшут они от текущей записи, ключ которой может меняться
в других сессиях.

А в ТП с ODBC-поставщиком данных такой хрени не происходит.
И насчет "лишние тормоза на ровном месте" хотелось бы, чтобы ты свое мнение
подтвердил конкретными цифрами и тестами. Если конечно сможешь написать ODBC-поставщика
на серверных курсорах.

А "проскок" N строк в текущей реализации ODBC-поставщика очень даже можно сделать.

select max(key) from (select top N key from lalala where key > storedkey order by key) topNkeys
либо
select top 1 key from (select top N key from lalala where key > storedkey order by key) topNkeys order by key desc

  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #65 - 26. Октября 2007 :: 06:36
Печать  
Цитата:
непонятно что означает ?
0

Как бы объяснить...
SQLite сначала вызывает у меня метод xBestIndex.
В него передает инфу об ограничениях (условиях). В данном случае передаст, что

PARENTID= //parentid будет сравниваться на равенство
ISFOLDER= //isfolder будет сравниваться на равенство
DESCR>  // descr будет сравниваться на большесть.

Я должен определиться, могу ли я использовать какой-либо индекс, исходя из заданных ограничений,
сообщить движку SQLite, какие из этих полей он может не проверять, и сформировать строку,
которую движок SQLite потом передаст в функцию xFilter.
А в ней я должен расшифровать эту строку, используя эту инфу для организации выборки.
Вот в этой строке я сначала пишу имя индекса (исключительно для того, чтобы видеть в плане выполнения какой индекс используется), а затем кодированную информацию о том, что делать с агрументами, переданными мне в xFilter.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #66 - 26. Октября 2007 :: 07:37
Печать  
Вечером постараюсь выложить тест с цифрами.
Получается что для связка 1с sql +
виртуальная таблица sqlite работает значительно быстрее чем скопированная в память родная таблица sqlite на реальном большом справочнике Клиенты.
Очень неожиданный положительный результат.
Для 1с dbf такого нет.( т.е. родная sqlite таблица быстрее чем вирт таблица )
Также компонента 1.4 на родной sqlite таблице работает чуть быстрее
чем с версией 1.0 1csqlite.dll, если надо то тоже выложу эти цифры.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #67 - 26. Октября 2007 :: 08:27
Печать  
orefkov писал(а) 26. Октября 2007 :: 06:12:
Теперь Uzhast.
Цитата:
Если у тебя возможность использования ТОЛЬКО SQL-запроса, то не получится. Но ты же имеешь прямой доступ к таблице 1С. Значит, у тебя есть возможность доступа к физическому номеру записи. Так что все выглядит просто:
1) Выбираем N строк с учетом упорядочивания. Для каждой строки запоминаем физический номер.
2) Когда ТП просит M строк с нужной строки, упорядочиваем записи, используя упорядочивающее выражение.
3) Переходим по физическому номеру записи к нужной.
4) Переходим к следующей/предыдущей записи в зависимости от того, в каком направлении двигаемся.
5) Выбираем M строк в нужном направлении.


Ты этот свой "простой" алгоритм кроме своей головы еще гденить пробовал тестить?
У тебя п.2 и п.3 противоречят друг-другу.

Пробовал. Работает. Смотри здесь: http://www.1cpp.ru/forum/YaBB.pl?num=1190523570/150

orefkov писал(а) 26. Октября 2007 :: 06:12:
Если ты используешь индекс для упорядочивания, то перейти по физическому номеру записи невозможно. Кроме как full-scan'ом.

Возможно. Учи матчасть.


orefkov писал(а) 26. Октября 2007 :: 06:12:
Во-вторых, ТП работает не так, как ты себе представляешь - оно не просит
провайдера "получи М строк от текущей записи".
Оно просит "получи первые М строк с ключом БОЛЬШИМ, чем вот этот сохраненный ключ"

Бред. ТП ВООБЩЕ ничего не знает про какие либо ключи. Оно просто запрашивает строки у провайдера. И все. Поэтому работает оно именно так, как я описал. Т.е. "взять M строк, начиная с данной".

Блин, orefkov, ну ты даешь!
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #68 - 26. Октября 2007 :: 08:29
Печать  
orefkov писал(а) 26. Октября 2007 :: 06:12:
Так вот в этом случае, если бы я точно был уверен, что одинаковые ключи в индексе
расположены СТРОГО по порядку номеров физических записей, алгоритм был бы таким:
1. Делаем index seek по переданному ключу.
2. Двигаемся по индексу далее, пока (номер записи меньше переданного и ключ не больше переданного).
3. Как только это условие не выполняется, получаем М строк.

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

Использование, например, ключа PARENTID,ISFOLDER,DESCR,ID (ID - это добивание ключа до уникального)
(выборка top n по возрастанию, т.е. строки, больше значения полного ключа)

0. Делаем index seek по переданному неполному ключу
1. Если такого ключа нет, Goto 6
2. Выбираем все записи по текущему ключу
3. Сортируем по ID
4. Запоминаем к возврату строку с upper_bound(id) по end
5. Если найдено достаточно строк, возвращаем результат (n строк)
6. Перемещаемся к следующему неполному ключу (идем по индексу)
7. Выбираем все значения ключа
8. Сортируем по ID
9. Запоминаем к возврату все строки
10. Goto 5

Конечно, тут есть приличный overhead, но алгоритм безопасен.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #69 - 26. Октября 2007 :: 08:30
Печать  
Z1 писал(а) 26. Октября 2007 :: 07:37:
Вечером постараюсь выложить тест с цифрами.
Получается что для связка 1с sql +
виртуальная таблица sqlite работает значительно быстрее чем скопированная в память родная таблица sqlite на реальном большом справочнике Клиенты.
Очень неожиданный положительный результат.
Для 1с dbf такого нет.( т.е. родная sqlite таблица быстрее чем вирт таблица )
Также компонента 1.4 на родной sqlite таблице работает чуть быстрее
чем с версией 1.0 1csqlite.dll, если надо то тоже выложу эти цифры.

Немного недопонял.
Если база не дбф, ВК не отображает таблицы 1С как виртуальные таблицы.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #70 - 26. Октября 2007 :: 08:50
Печать  
Uzhast писал(а) 26. Октября 2007 :: 08:27:
Бред. ТП ВООБЩЕ ничего не знает про какие либо ключи. Оно просто запрашивает строки у провайдера. И все. Поэтому работает оно именно так, как я описал. Т.е. "взять M строк, начиная с данной".

ТП 100% не знает, поэтому его так легко обмануть. Плачущий
Суть в привязке CDataRow, она может быть привязана к физической строке - и тогда быть беде, либо к логической, т.е. некому абстрактному местоположению в пространстве строк (что сейчас и сделано для ODBC провайдера).

Ну, собственно, теоретическая база у нас уже распухла Улыбка
Будет интереснее пообсуждать уже проблемы реальных моделей.

Модель с физической привязкой, кстати, уже есть.
Это VT провайдер.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #71 - 26. Октября 2007 :: 08:52
Печать  
orefkov писал(а) 26. Октября 2007 :: 06:12:
Ща я тебе покажу, какая это гадость - курсоры.
...
Внимательно наблюдаем  за интересными артефактами.
...
В другой пытаемся  походить вверх/вниз от текущего элемента. И не можем этого сделать.

Вот так вот работают курсоры.
И как раз из-за того, что пляшут они от текущей записи, ключ которой может меняться
в других сессиях.

А в ТП с ODBC-поставщиком данных такой хрени не происходит.

Никаких "особо страшных артефактов" при этом не проявляется. Все логично. Изменилось место текущей записи в упорядоченном наборе - курсор этот факт отобразил. Здесь все зависит от точки зрения, что юзабельнее: поведение курсора или запроса. Я считаю, что оба варианта поведения нормальны.

orefkov писал(а) 26. Октября 2007 :: 06:12:
А "проскок" N строк в текущей реализации ODBC-поставщика очень даже можно сделать.

select max(key) from (select top N key from lalala where key > storedkey order by key) topNkeys
либо
select top 1 key from (select top N key from lalala where key > storedkey order by key) topNkeys order by key desc


Вот-вот, тормоза на ровном месте. Особенно, если N = 150000, например (или у тебя другие данные?). А в случае индексов пропустить нужное количество строк можно практически мгновенно.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #72 - 26. Октября 2007 :: 09:13
Печать  
Uzhast писал(а) 26. Октября 2007 :: 08:27:
orefkov писал(а) 26. Октября 2007 :: 06:12:
Если ты используешь индекс для упорядочивания, то перейти по физическому номеру записи невозможно. Кроме как full-scan'ом.

Возможно. Учи матчасть.

Ню-ню.
Если ты думаешь, что написав
set order to idd
goto 100

фокс тебе моментом найдет запись, не применив full scan по индексу, то эт вряд ли.
Вроде такой большой, а в сказки веришь Улыбка
А матчасть я-то изучал уже, вплоть до структуры cdx-файла.
И прямо тебе скажу, что информации, что бы по номеру записи найти узел в дереве индекса, соответствующий этой записи, с тем чтобы двинуться от этого узла дальше, в нем нет. Кроме, естественно, полного обхода дерева индекса с корня до нахождения листа с нужным номером записи.
Возможно, это одна из причин 30-40% загрузки проца в твоем провайдере.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #73 - 26. Октября 2007 :: 09:21
Печать  
orefkov писал(а) 26. Октября 2007 :: 09:13:
Ню-ню.
Если ты думаешь, что написав
set order to idd
goto 100

фокс тебе моментом найдет запись, не применив full scan по индексу, то эт вряд ли.
Вроде такой большой, а в сказки веришь Улыбка
А матчасть я-то изучал уже, вплоть до структуры cdx-файла.
И прямо тебе скажу, что информации, что бы по номеру записи найти узел в дереве индекса, соответствующий этой записи, с тем чтобы двинуться от этого узла дальше, в нем нет. Кроме, естественно, полного обхода дерева индекса с корня до нахождения листа с нужным номером записи.
Возможно, это одна из причин 30-40% загрузки проца в твоем провайдере.

Орефков, не позорься. Итак, читаем матчасть:
Цитата:
GO | GOTO Command
...
Parameters
RECORD nRecordNumber


Specifies the physical record number to move the record pointer to. You can omit GO or GOTO entirely and specify just the record number. If you specify just the record number, you can move the record pointer only within the current work area.

Орефков! Физический номер записи не имеет НИКАКОГО отношения к индексу, как тебе почему-то кажется. Ну никакого! Это действительно ФИЗИЧЕСКИЙ номер записи - т.е. элементарный порядковый номер записи в файле. Эти номера не зависят от индекса - они зависят от ПОРЯДКА ДОБАВЛЕНИЯ ЗАПИСЕЙ В ТАБЛИЦУ. Дошло?

А загрузка 30-35% связана не со сканом. На большом журнале документов загрузка процессора полностью эквивалентна загрузке процессора на легонькой табличке из пары сотен строк. Т.е. доступ по физическому номеру происходит МГНОВЕННО! А потребление 30-35% связано с вызовами prg-скрипта. К слову сказать, даже без фокса (на каких-нибудь ТЗ) потребление процессора в ТП может доходить до 15-20%.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #74 - 26. Октября 2007 :: 09:23
Печать  
Uzhast писал(а) 26. Октября 2007 :: 08:52:
orefkov писал(а) 26. Октября 2007 :: 06:12:
Ща я тебе покажу, какая это гадость - курсоры.
...
Внимательно наблюдаем  за интересными артефактами.
...
В другой пытаемся  походить вверх/вниз от текущего элемента. И не можем этого сделать.

Вот так вот работают курсоры.
И как раз из-за того, что пляшут они от текущей записи, ключ которой может меняться
в других сессиях.

А в ТП с ODBC-поставщиком данных такой хрени не происходит.

Никаких "особо страшных артефактов" при этом не проявляется. Все логично. Изменилось место текущей записи в упорядоченном наборе - курсор этот факт отобразил. Здесь все зависит от точки зрения, что юзабельнее: поведение курсора или запроса. Я считаю, что оба варианта поведения нормальны.

Лукаваишь, ой лукавишь.
На варианте, когда из-за изменения родителя одним юзером другой даже сдвинутся с места с записи не может, ты решил не заострять внимания.
Да и с этими артефактами - видимо тебе юзеры не разу не звонили - "Что за хрень у меня в списке творится? Иду по справочнику, а вместо одного элемента другие появляются. Стою на "А", перехожу почему-то на "Я".
И твою точку зрения, что это нормально, они бы тебе запихали глубоко.
Согласись, это не нормально, когда изменения, сделанные одним юзером, сбивают выборку у другого.
Человек вправе ожидать, что после "А" будет идти "Б", чего бы другие там в базе не творили.

Uzhast писал(а) 26. Октября 2007 :: 08:52:
orefkov писал(а) 26. Октября 2007 :: 06:12:
А "проскок" N строк в текущей реализации ODBC-поставщика очень даже можно сделать.

select max(key) from (select top N key from lalala where key > storedkey order by key) topNkeys
либо
select top 1 key from (select top N key from lalala where key > storedkey order by key) topNkeys order by key desc


Вот-вот, тормоза на ровном месте. Особенно, если N = 150000, например (или у тебя другие данные?). А в случае индексов пропустить нужное количество строк можно практически мгновенно.

Скажу тебе по секрету, что когда работаешь с SQL-сервером, для любых действий надо делать запрос.
И зря ты думаешь, что такой запрос напряжет сервер. Он, сука, умный, и поймет, что от него хотят всего-лишь seek and skip.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 3 4 [5] 6 7 ... 20
ОтправитьПечать