Ви можете прискорити доступ до даних таблиць, якщо будете раціонально використовувати індекси і буферизацію. Крім того, можете використовувати технологію Rushmore Query Optimization для оптимізації ваших запитів.
Для того, щоб прискорювати доступ до даних в таблиці, використовуйте індекс. Додавання індексу до таблиці прискорює пошук даних в ній, особливо при майстерному застосуванні технології Rushmore для оптимізації цього пошуку. Крім того, індексування дозволяє Вам, щоб працювати з даними, відсортованими в потрібному порядку; наприклад, при перегляді можна впорядкувати таблицю покупців на прізвище.
Якщо записи в таблиці містять унікальні ключі, то створіть для ключового поля первинний індекс або індекс-кандидат. Ці типи індексів дозволяють Visual FoxPro перевіряти правильність ключів на низькому рівні (без програмування), що забезпечує найбільшу продуктивність.
Додатково до індексування полів, використовуваних для пошуку і сортування, ви повинні проіндексувати поля, включені в операцію об'єднання (join) таблиць. Якщо ви поєднуєте дві таблиці за допомогою неіндексованих полів, то така операція може зажадати на своє виконання в сотні разів більше часу.
Важливою особливістю Visual FoxPro є можливість створення індексу з будь-якого виразу. (В деяких системах управління базами даних допускаються індекси тільки по полях). Ця можливість дозволяє вам застосовувати індекси для оптимізації пошуку, сортування та операцій об'єднання, використовуючи комбінації полів або формуючи з полів вирази. Наприклад, ви можете індексувати поле Імені, що базується на вираженні, що використовує функцію SOUNDEX () . Таким способом ваше додаток може забезпечити швидкий доступ до імен, які звучать однаково.
При доповненні індексів в таблиці, ви повинні підтримувати баланс між вигодою, яку ви отримаєте в часі пошуку, і неминучими втратами, які виникнуть при оновленні проіндексованих таблиць. Як тільки ви додасте індекси до своїх таблиць, негайно ж операції оновлення і вставки записів в таблиці почнуть сповільнюватися внаслідок з тієї причини, що Visual FoxPro змушений буде оновлювати кожен індекс.
І нарешті, я уникаю використання індексування по полях, які містять тільки обмежене число дискретних значень, наприклад, по логічним полях. В цьому випадку, індекс буде містити мало даних, і, ймовірно, накладні витрати по підтримці індексу переважать ту користь, яку ви отримаєте від такого індексу при пошуку.
Щодо деталей ефективного індексування при використанні технології Rushmore ви можете звернутися до розділу Використання оптимізації запитів Rushmore для прискорення доступу до даних .
При створенні об'єднань за допомогою команди SELECT - SQL такі ситуації можуть знизити продуктивність і привести до непередбачуваних результатів:
- При об'єднанні таблиць, в однієї з них відсутній первинний або унікальний ключ.
- Об'єднуються таблиці містять незаповнені поля.
Для того, щоб уникнути цих ситуацій, створіть об'єднання, засновані на відносинах між первинними ключами в одній таблиці і зовнішніми ключами в інший. Якщо Ви створюєте об'єднання, засноване на даних, які не є чимось унікальним, то кінцевий результат може може містити всі дані з обох таблиць. Наприклад, наступна команда SELECT - SQL створює об'єднання, результат якого може бути дуже об'ємним:
У цьому прикладі, поштовий код буде однозначно ідентифікувати місце розташування клієнта в межах міста, але цього може виявитися недостатньо в тому випадку, якщо ви збираєтеся зіставити записи клієнта з записами замовлення. Поштовий код не однозначно ідентифікує клієнта або замовлення. Замість цього створіть об'єднання наступною командою:
У цьому прикладі, поле customer_id однозначно ідентифікує конкретного клієнта і його ж замовлення і, отже, створює результуючий набір, який об'єднує записи клієнта з кожним записом замовлення.
Крім того, проявіть обачність при об'єднанні таблиць з незаповненими полями, оскільки Visual FoxPro не може порівняти поля з невизначеними (null) значеннями. При створенні об'єднання перевіряйте значення полів на їх обов'язкову заповненість.
Наприклад, якщо ви припускаєте, що поле customer_id в таблиці Замовлень може бути порожнім, то застосуєте таку команду SELECT - SQL, яка відфільтрує записи з клієнтами без номера:
Замітка: Можна, також, перевірити заповненість символьного поля за допомогою функції EMPTY () , Але вона працює повільніше, ніж операція порівняння з константою.
При використанні менеджера проекту ви можете об'єднати необмежену кількість програм і процедур в одному .app або .exe файлі. Це може істотно збільшити швидкість виконання програми з двох причин.
По-перше, Visual FoxPro відкриває програмний файл і залишає його відкритим. Пізніше, коли ви дасте команду DO в програмі, що міститься у файлі, Visual FoxPro не потрібно буде знову відкривати цей файл.
По-друге, додаток, що складається тільки з одного або двох файлів, зменшує кількість файлів, що зберігаються в робочій папці. Швидкість всіх файлових операцій зростає, оскільки операційна система буде перевіряти меншу кількість елементів в папці при відкритті, перейменування, або видаленні файлів.
Більш докладно про те, як використовувати менеджер проектів для створення додатків, читайте в розділі компіляція додатки .
Для того, щоб створювати найшвидші таблиці і індекси, підіть за нижченаведеними рекомендаціями.
- Якщо не включена буферизація записів або таблиць, то застосовуйте команду INSERT - SQL замість пари команд APPEND BLANK і REPLACE, що особливо важливо для індексованих таблиць в середовищі з багатьма користувачами, оскільки при цьому індекси будуть оновлюватися тільки один раз.
- Якщо необхідно додати багато записів в індексовану таблицю, то швидше буде спочатку видалити індекс, потім додати записи і після цього створити індекс заново.
- По можливості, уникайте виконання функцій в SQL-командах, особливо в тих, які повертають більше одного запису. Справа в тому, що такі команди повинні повторно обчислюватися для кожного запису (при цьому функції кожного разу будуть викликатися знову). Якщо Ви створюєте команду SQL зі змінними даними, то використовуйте вирази імені або макропідстановки замість функції EVALUATE (). Поки що, найкращою стратегією є динамічне формування всієї команди SQL, а не тільки його окремих пропозицій (clause). Детальніше про це дивіться в розділах Використання макросів і Створення іменованих виразів .
- Як правило, якщо ви часто використовуєте один і той же індекс, то можете поліпшити продуктивність програми періодично сортуючи таблицю по індексному висловом.
- У багатокористувацької середовищі застосовуйте файли .cdx замість файлів .idx, тому що оновлення одного файлу .cdx відбувається швидше, ніж декількох файлів .idx.