Оптимизация запросов в Delphi 4

В Delphi 4 у нас есть один запрос SELECT, который извлекает 3 поля типа текста вместе с другими обязательными полями за раз с использованием компонента TQuery .
Есть более 1000 записей (которые могут увеличиться в будущем).
Этот запрос потребляет много памяти. и я думаю, что из-за этого следующего запроса требуется огромное количество времени для выполнения.

Я использую BDE для подключения к SQL-серверу.

Мне нужно оптимизировать производительность, чтобы не потребовалось столько времени. Пожалуйста посоветуй.

    Вы должны рассмотреть какой-то механизм пейджинга. не извлекайте 1000 (или 1 миллион) записей клиенту, а вместо этого используйте пейджинг с SQL-сервером ROW_NUMBER() чтобы получить блоки, скажем, 50-100 записей на страницу.

    поэтому запрос типа:

     SELECT id, username FROM mytable ORDER BY id 

    может выглядеть так:

     SELECT * FROM ( SELECT id, username, TOTAL_ROWS=Count(*) OVER(), ROW_NUMBER() OVER(ORDER BY id) AS ROW_NUM FROM mytable ) T1 WHERE ROW_NUM BETWEEN 1 AND 50 

    Поле (ы) ORDER BY должно быть проиндексировано (если возможно), чтобы ускорить процесс.

    Если вы используете TQuery , убедитесь, что вы используете локальный TField вне цикла поиска для ускорения процесса (метод FieldByName работает несколько медленно).

    Вы можете попробовать наши бесплатные классы Open Source для доступа к любому движку БД.

    Он обеспечивает прямой доступ к MS SQL через OleDB, не вызывая уровень ADO.

    Он очень оптимизирован для скорости и готов к работе в Unicode даже в старой версии Delphi. Он был протестирован в Windows XP, Vista и Seven (включая 64 бит).

    У этого есть эмулятор TQuery : это не истинный TQuery как определено в блоке DB.pas , а класс с большинством тех же методов. И вам не нужно будет работать со всеми классами и единицами BDE. Недостатком является то, что вы не можете использовать визуальные элементы управления Delphi DB, но для быстрого TQuery он выполнит эту работу.

    Он имеет некоторые уникальные функции (например, использование позднего связывания для доступа к полям), которые стоит рассмотреть.

    Он не требует сторонней библиотеки (например, BDE) и работает от Delphi 5 до XE2. Думаю, он будет работать и под Delphi 4.

    Вы можете скачать и запросить поддержку на нашем сайте .

    На самом деле получение значений столбца TEXT занимает время и занимает память.

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

    Чтобы уменьшить использование памяти, как описано выше, используйте Unidirectional запрос или bove.

    Чтобы сократить время (в зависимости от данных), мы можем использовать DATALENGTH в запросе.

    как

     DATALENGTH(TEXT) <> 0 

    Это не будет загружать записи, не имеющие значения в поле TEXT .

    • Какие типы полей вы определили? Если они большие, они будут занимать память, вы мало что можете с этим поделать. Вы можете попробовать разные библиотеки, некоторые из них достаточно умны, чтобы выделять только фактический размер поля, а не объявленный, другой всегда будет выделять объявленный, поэтому, если у вас есть три поля из 4000 символов и 1000 записей, у вас будет 3 * 4000 * 1000 байт, выделенных только для текстовых полей.
    • Вам нужно сразу загрузить весь набор данных? Получение только необходимых данных с использованием условия where и / или инкрементной выборки поможет уменьшить как память, так и, возможно, время выполнения
    • Если запрос занимает много времени, вы должны понять, почему и где. Это может быть время выполнения запроса, это может быть время, затраченное на передачу набора результатов в клиентское приложение. Вам нужно рассказать о своем запросе, чтобы понять, в чем проблема, и предпринять правильные корректирующие действия. 1000 записей – это очень маленький набор данных сегодня, если он медленный, что-то действительно плохое.
    • Каждая база данных имеет тонкие различия в оптимизации. Вам нужно изучить тот, который вы используете, и написать правильный запрос для этой базы данных – после того, как вы создали подходящую базу данных.

    Просто изменение компонентов базы данных, не определяя, что это именно так, просто глупо, и если проблема в другом месте, это просто потерянное время. BDE работает достаточно хорошо, особенно если сравнивать с ADO. И Microsoft также поддерживает ADO, поэтому я не буду вкладывать в нее время и деньги.

    Обновление: было бы интересно узнать, почему этот ответ был опущен. Просто потому, что поклонники ADO будут иметь трудное время в будущем, и они чувствуют необходимость скрывать правду?

    СОХРАНЯЙТЕ НА СКАЧИВАНИЕ МОРОНОВ. ВЫ ТОЛЬКО ПОКАЗЫВАЕТЕ ИГНОРИРОВАНИЕ!

    Interesting Posts

    Дублировать строку, вставленную в отдельную таблицу, в то время как вставка с использованием нескольких таблиц слева

    Загрузка существующей базы данных через Plesk

    быстрое обновление с помощью sql

    SQL Побитовая операция (MySql)

    Студия управления SQL Server для VS2010

    T-SQL – SELECT к ближайшей дате и GROUPED BY ID

    Найти все строки в таблице Sql Server, содержащие теги HTML

    SQL-запрос с использованием fn_Split для поиска нескольких значений в столбце

    Создайте строку, разделенную запятыми, с номерами от 1 до x, где x считывается из записи

    Функции с таблицей возвратов «нет» … конец?

    Автоинкремент в Entity Framework 5 без столбца идентификатора в базе данных

    Как остановить (освободить) SQL-сервер в Azure?

    Отправка электронной почты с помощью sp_send_dbmail () иногда не работает

    запрос обновления не работает в веб-приложении ASP.NET

    Выключить триггеры, если транзакция завершилась неудачей в SQL Server?

    Давайте будем гением компьютера.