sql: как улучшить этот статус - PullRequest
3 голосов
/ 10 августа 2010

У меня есть следующее заявление sql, которое мне нужно сделать быстрее.Есть 500 тыс. Строк, и я индекс для 'HARDWARE_ID', но это все еще занимает до секунды, чтобы выполнить.

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

    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 секунд.

Спасибо за вашу помощь.

Ответы [ 3 ]

2 голосов
/ 10 августа 2010

Индекс для DM_ID должен быть создан как asc

Проблема может заключаться в том, что вы нашли очень быстрое совпадение формы 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 работает быстрее

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

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

1 голос
/ 10 августа 2010

Попробуйте заменить '*' только на список необходимых вам атрибутов. Очень часто это может дать вам значительное увеличение скорости.

0 голосов
/ 10 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...