2011-12-15 5 views
3

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

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

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

+4

Я уверен, что ADO не был представлен до Delphi 5 (возможно, даже позже этого). – LaKraven

+0

TQuery абсолютно НЕ лучший способ сделать это! Для одного он разработан для Borland Database Engine, который является доисторическим – LaKraven

+0

TQuery использует BDE, он устарел в течение длительного времени. Лучше сначала обновить и использовать современные компоненты доступа к данным (AnyDAC, UniDAC или dbExpress). – kludg

ответ

0

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

как

DATALENGTH(TEXT) <> 0 

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

1

Если вы используете 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.

Вы можете скачать и запросить поддержку in our site.

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

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

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

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

+0

«Microsoft не поддерживает ADO». Это действительно интересно для меня. У вас есть какие-либо ссылки или подобные, которые подтвердят, что вы здесь говорите? Эта ссылка не согласна с вами. http://msdn.microsoft.com/en-us/library/ms810810.aspx –

+0

http://blogs.msdn.com/b/sqlnativeclient/archive/2011/08/29/microsoft-is-aligning-with- odbc-for-native-relational-data-access.aspx –

+0

Благодарим вас за ссылку, но ADO не упоминается в сообщении блога. Поставщик OLE DB SQL Server не совпадает с ADO. По-видимому, совершенно нормально использовать ADO с поставщиком собственного клиента SQL Server. –

2

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

+0

Приятная идея, но приложение использует 'BDE' и' SQL Links', которые не поддерживают 'ROW_NUMBER()', насколько это возможно как я могу вспомнить. Я не думаю, что он существовал в «SQL Server» в то время; «BDE» устарел уже более десяти лет. –

0

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

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

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