Производительность JET SQL / Понимание SQL - PullRequest
1 голос
/ 15 сентября 2010

Это не проблема, требующая ответа, а скорее вопрос о том, почему это происходит.

У меня есть поле в одной таблице, которое заполнено 'Y' или 'N', и у меня есть запрос, который просто берет значение этого поля и выскакивает в другую таблицу

В таблице приблизительно 25 000 записей

Выполнение запроса ниже занимает около 25 секунд.

UPDATE ObjectivesApproved 
       INNER JOIN Approved 
          ON ObjectivesApproved.ID = Approved.ID 
   SET ObjectivesApproved.Football = [Approved].[Cri Football Related];

Удаление операции JOIN делает запрос еще длиннее.

Если, однако, я делаю ниже, вся операция занимает менее 5 секунд, даже если она выполняет 2 запроса

UPDATE ObjectivesApproved 
       INNER JOIN Approved 
          ON ObjectivesApproved.ID = Approved.ID 
   SET ObjectivesApproved.Football = 'Y' 
 WHERE (([Approved].[Cri Football Related]='Y'));

UPDATE Approved 
       INNER JOIN ObjectivesApproved 
          ON Approved.ID = ObjectivesApproved.ID 
   SET ObjectivesApproved.Football = 'N' 
 WHERE (([ObjectivesApproved].[Football] Is Null));

Я доволен своим решением, даже если оно немного не элегантно, но для того, чтобы углубить мое понимание SQL, почему это может происходить?

Ответы [ 2 ]

2 голосов
/ 15 сентября 2010

Ваша первая версия обновляет 25K строк независимо от того, что, но она должна поддерживать синхронизацию таблиц, поскольку она использует значения из одного в другое на строке за строкой . Каждая обновленная строка должна читаться из поля - 25K раз.

Ваша вторая версия (оба оператора) фильтрует данные вместо сравнения строк за строкой. Внутренне набор записей обнаруживается и затем обновляется в пакете, а не по строкам. Значение «Y» не нужно искать каждый раз - оно постоянно.

Представьте себе, если бы я попросил вас покрасить 25-килограммовые коробки в черный или белый на основе списка, который я вам дал. Быстрее ли выбрать первое поле, проверить список и раскрасить его, выбрать второе поле, проверить список, раскрасить его, повторить? Или быстрее вытащить всех, которые должны быть белыми, и покрасить их, затем всех черных и покрасить. Обратите внимание, что вам нужно «проверить список» только 2 раза во втором случае, но 25K раз в первом случае.

1 голос
/ 16 сентября 2010

Я помещаю их в комментарии, но понимаю, что они представляют собой что-то вроде ответа:

Вы говорите, что индексов нет, но вы говорите, что поля идентификаторов - это PK. Если это так, то в этих полях должен быть уникальный индекс. Если нет, то они на самом деле не являются PK, и это может объяснить, почему версии с предложениями WHERE быстрее, чем версии только с JOIN.

Кроме того, Google "Jet SHOWPLAN", чтобы вы могли видеть, что делает оптимизатор запросов Jet, а затем вы действительно можете увидеть, что происходит.

С индексами вы получите слияние индексов, и это должно быть довольно быстро. Без них я не уверен, как Jet сделает это. Кроме того, это может иметь значение, если ваше поле Y / N проиндексировано. Полномочия, которые советуют никогда не индексировать малонаселенные поля (т. Е. Поля с низким количеством элементов), но я обнаружил, что индексные логические поля в Jet / ACE действительно могут существенно повлиять на производительность.

...