Конференция "Базы" » Запрос на выборку [D7, access]
 
  • Виталий Панасенко (22.05.09 09:58) [20]
    А почему фотки не показывать отдельно? точнее, фетчить? бегай себе по гриду, нужно показать всю инфу(фото) - выборка ОДНОЙ ЗАПИСИ для показа
  • Сергей М. © (22.05.09 10:27) [21]

    > в DataSet это не отмечено


    Что значит "не отмечено" ?
  • MsGuns © (22.05.09 10:58) [22]
    >На слабых машина прога виснет. На моем ноуте Core2Duo с 4 гигами задержка примерно >секунды 3. Количество записей около 500 записей с фотками.

    Во как !
    Решение в [20] - т.е. извлекаются все поля, которые можно внятно (т.е. текстом) показать в сетке. А для фоток кнопульку, по нажатию на которую с сервера тянется блоб (блобы) ТОЛЬКО ПО ТЕКУЩЕЙ ЗАПИСИ. Ну примерно так, как это показано в фильмах, где смотрят разные досье
  • Медвежонок Пятачок © (22.05.09 11:18) [23]
    Два раза. Например мы ввели символ "а" - у нас список фамилий на "а". Нажали "Backspace" - у нас таблица полностью.

    Например он сначала ввел "ля-ля-тополя", а потом притопил backspace
  • sniknik © (22.05.09 11:51) [24]
    > Но стоит очистить поле база замирает выполняя запрос
    на выборке без условий, т.е. 500 записей? смешно. где то еще есть неучтенные тормоза, может у тебя какие то события привязаны к датасету.
    проверь свой полный запрос в независимой проге, например -
    http://webfile.ru/3635677
    тоже 3 сек?

    и потом, если есть выборка полностью то частичная она как бы уже лишняя, отбор произошел, смысла перезапрашивать нет, можно делать просто фильтром по выбранному.
  • Игорь Шевченко © (22.05.09 11:58) [25]

    > 1000 записей выбирается за 0,01 секунды максимум


    Это смотря какой запрос
  • sniknik © (22.05.09 12:04) [26]
    > Это смотря какой запрос
    в accecc особо сложных не бывает.

    тем более здесь уже явно указан
    > CustDS.CommandText:='select * from customers order by card';
    выполняется 3 сек на Core2Duo с 4 гигами.

    очевидно что то не так.
  • Нат (23.05.09 00:56) [27]
    1. Зачем в гриде поле с фоткой?
    Все равно толком не отобразить.
    Для фотки сделать отдельный запрос и датасет.
    2. ADODataSet сам (внутри себя) реализует то, что Вы пытаетесь сделать.
    Для этого есть свойства CacheSize, BlockReadSize  и MaxRecords и событие OnEndOfRecordSet
  • sniknik © (23.05.09 13:09) [28]
    > Для фотки сделать отдельный запрос и датасет.
    зачем? блоб поля и так не включаются в датасет, и скачиваются с сервера только при обращении т.е. тут при отрисовке.

    > 2. ADODataSet сам (внутри себя) реализует то, что Вы пытаетесь сделать.
    не совсем, есть похожий режим но это не то что хочет автор.
    он хочет скачать 10 и показывать их пока страницу не перелистнут тогда скачать следующие 10 и т.д., т.е. делается скачка и показ кусками.
    а то про что ты говоришь, это способ построения рекордсета, т.е. там скачивается на размер блока и сразу после этого рекордсет становится активным, данные отображаются но скачка не останавливается а продолжается в фоне пока не сформируется весь, неважно перелистнут страницу или нет.
    разница однако.
    скорее к тому что он хочет ближе серверный курсор, но и он работает не совсем так, не блоками, а по обращению непосредственно к записям. если смотреть только на листание то оно будет один в один как хочет. но без толку, т.к. проблема не в способе запросов. этим только "замылит" настоящую проблему (ну вот представим что на получение записи стоит какая то обработка и тормоз от нее, при локальном курсоре она прогоняется 500раз при открытии и тормоза заметны, при серверном будет только 10 (сколько получили для отображения грида), незаметно хотя проблемная обработка никуда не делась, т.е. тормоза сейчас сконцентрированные в одном месте просто "размажутся" по всему времени работы с датасетом, но стоит например сделать по нему цикл... все начнется заново.).
  • Нат © (24.05.09 04:06) [29]
    Да, проблема не локализована.
    По поводу ускорения.
    1. Преступно формировать запрос "select ..." + Edit2.Text
    Можно гарантировать, что в едите не всегда будут правильные данные.
    2. Вы похоже обрабатываете запрос на ввод каждого символа.
    Может быть стоит ужесточить условия отбора вводом как минимум 2..3-х символов. Кроме того, стоит проверять на пустоту едита.
    Т.о. сначала присваиваете в переменную, если имеется пустое значение, подставляйте что-нибудь, что не позволит вывести все записи.
    3. В большинстве случаев можно явно указать требуемые поля.
    Выводите не все, а минимум, необходимый в гриде.
    Для подробных сведений, делайте Детайл - все поля будете выводить только для одной записи.
    Например.
    If lenght(Edit2.Text) <3 then TextVal := "Ключ к записи, которая выводится по умолчанию"
    else  TextVal := Edit2.Text;
    "select id, tel, adr, director ..." + TextVal + "%";
    Таким образом, вы будете перекачивать по сети на порядок меньше информации.
  • Нат © (24.05.09 04:14) [30]
    Поправлю
    If lenght(Edit2.Text) <3 then TextVal := "Ключ к записи, которая выводится по умолчанию"
    else  TextVal := Edit2.Text + "%";
    "select id, tel, adr, director ..." + TextVal ;
    Добавлять впереди "%" - нет смысла, это ограничит возможности.
    Без первого "%" поиск осуществляется с начала строки.
    Если пользователь желает, он сам добавит "%" в эдит, и поиск пойдет по вхождению подстроки с любого места.
 
Конференция "Базы" » Запрос на выборку [D7, access]
Есть новые Нет новых   [134473   +31][b:0][p:0]