Оптимизация запросов в Delphi 4 - PullRequest
3 голосов
/ 15 декабря 2011

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

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

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

Ответы [ 5 ]

2 голосов
/ 15 декабря 2011

Вы должны рассмотреть какой-то механизм пейджинга. не извлекайте 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 должно быть проиндексировано (если возможно), чтобы ускорить процесс.

1 голос
/ 15 декабря 2011

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

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

Он обеспечивает прямой доступ к 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.

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

0 голосов
/ 16 мая 2012

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

как

DATALENGTH(TEXT) <> 0

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

0 голосов
/ 15 декабря 2011

Действительно выборка TEXT значений столбца занимает время и занимает память.

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

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

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

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

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

ПРОДОЛЖАЙТЕ ПОСЛЕДУЮЩИХ МОРОНОВ.ВЫ ПРОСТО ПОКАЗЫВАЕТЕ НЕЗНАНИЕ!

...