Оптимизация запросов в Delphi 4
В Delphi 4 у нас есть один запрос SELECT, который извлекает 3 поля типа Text вместе с другими обязательными полями одновременно, используя TQuery
составная часть.
Есть более 1000 записей (которые могут увеличиться в будущем).
Этот запрос занимает много памяти. и я думаю, что из-за этого следующего запроса требуется огромное количество времени для выполнения.
Я использую BDE для подключения к SQL-серверу.
Мне нужно оптимизировать производительность, чтобы это не занимало так много времени. Пожалуйста посоветуй.
5 ответов
Чтобы сократить время (в зависимости от данных), мы можем использовать DATALENGTH в запросе.
лайк
DATALENGTH(TEXT) <> 0
Это не будет загружать записи, не имеющие значения в TEXT
поле.
Вы должны рассмотреть какой-то механизм пейджинга. не извлекайте 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
метод несколько медленный).
Вы можете попробовать наши бесплатные классы с открытым исходным кодом для доступа к любому движку БД.
Он обеспечивает прямой доступ к 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
запрос или буве.
- Какие типы полей вы определили? Если они большие, они займут память, вы мало что можете с этим поделать. Вы можете попробовать разные библиотеки, некоторые достаточно умны, чтобы распределять только фактический размер поля, а не объявленный, другие всегда будут выделять объявленный, поэтому, если у вас есть три поля по 4000 символов и 1000 записей, у вас будет 3 * 4000 * 1000 байтов выделено только для текстовых полей.
- Вам нужно загрузить весь набор данных одновременно? Выборка только необходимых данных с использованием условия where и / или инкрементальной выборки поможет сократить объем памяти и, возможно, время выполнения.
- Если выполнение запроса занимает много времени, вы должны понять, почему и где. Это может быть само время выполнения запроса, это может быть время, необходимое для передачи набора результатов клиентскому приложению. Вам нужно профилировать свой запрос, чтобы понять, в чем проблема на самом деле, и предпринять соответствующие корректирующие действия. 1000 записей - это очень маленький набор данных сегодня, если он медленный, есть что-то действительно плохое.
- Каждая база данных имеет тонкие различия в оптимизации. Вы должны внимательно изучить тот, который используете, и написать правильный запрос для этой базы данных - после того, как вы разработали правильную базу данных.
Простое изменение компонентов базы данных без определения того, что это именно причина, просто глупо, и если проблема в другом месте, это просто потраченное время. BDE работает достаточно хорошо, особенно если сравнивать с ADO. И Microsoft также поддерживает ADO, поэтому я не буду вкладывать в это время и деньги.
Обновление: было бы интересно узнать, почему этот ответ был отклонен. Только потому, что поклонникам ADO в будущем будет нелегко, и они чувствуют необходимость скрыть правду?
ПРОДОЛЖАЙТЕ СКАЧАТЬ МОРОНЫ. ВЫ ПРОСТО ПОКАЗЫВАЕТЕ НЕЗНАНИЕ!