2010-08-10 3 views
3

У меня есть следующее заявление sql, которое мне нужно сделать быстрее. Есть 500k строк, и я индекс для «HARDWARE_ID», но это все равно занимает до секунды.sql: как улучшить этот статус

У кого-нибудь есть идеи?

select 
     * 
    from 
     DEVICE_MONITOR DM 
    where 
      DM.DM_ID = (
     select 
      max(DM_ID) 
     from 
      DEVICE_MONITOR 
     where 
      HARDWARE_ID=#value# 
    ) 

Я нашел следующий индекс также большая помощь ...

CREATE INDEX DM_IX4 ON DEVICE_MONITOR (DM_ID, HARDWARE_ID);

В моем тесте он сбрасывает время выполнения от 26 секунд до 20 секунд.

Благодарим за помощь.

+0

У вас есть указатель на DM_ID? –

ответ

2

Индекс для DM_ID должен быть создан как возрастанию

Проблема может быть в том, что Вы нашли очень быстрый матч формы HARDWARE_ID, но затем эти записи должны отсортированный извлечь максимум из них и эта операция времени потребляя.

Попытки сравнить эти заявления:

1 #result = select max(DM_ID) from DEVICE_MONITOR where HARDWARE_ID=#value# 

2 select * from DEVICE_MONITOR DM where DM.DM_ID = #result 

запрос 1 проблема, как вы увидите, что 2 работают быстрее

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

Если возможно вместо * использовать только столбец, который вам действительно нужен

0

Если у вас есть кластерный индекс на DM_ID, то это выглядит как самый быстрый запрос.

Редактировать: Ack. У Даниэля есть правильный ответ. Пропустил это.

1

Рассмотрите возможность изменения «*» только на список необходимых атрибутов. Очень часто это может привести к значительному увеличению скорости.

+0

Полностью согласен с вами. Это, вероятно, даст вам наибольшее увеличение производительности. –

Смежные вопросы