2012-05-11 7 views
1

Запрос 1:Как улучшить производительность выполнения запросов SQL?

select a.* 
from 
    (
    select 
row_number() over (order by id desc) as srno 
id,name as myname,* 
    from table 
where name like 'search%' or column1 like 'search%' or column2 like 'search%' 
or column3 like 'search%' 
or column4 like 'search%' 
or column5 like 'search%' 
    ) a 
where srno>=1 and srno<=50 

У меня есть 100 000 строк на моем столе. Выполнение этого запроса занимает 48 секунд. Я применил альтернативный запрос:

запрос 2:

select top 50 
row_number() over (order by id desc) as srno 
id,name as myname,* 
    from table 
where name like 'search%' or column1 like 'search%' or column2 like 'search%' 
or column3 like 'search%' 
or column4 like 'search%' 
or column5 like 'search%' 

запрос 2 принимать приблизительную 0 секунд, чтобы выполнить там индексирует все готово Applied в обоих случаях

делает ли способ выполнить запрос 1 В течение 0 секунд?

I wany to real time Execution Speed.

+2

Где ваши индексы? Какие СУБД вы используете? – Marc

+0

Существуют ли индексы на 'name' и' column1' '' column5'? И я не имею в виду один комбинированный индекс для всех 6 столбцов, но один индекс для каждого из них? Также: Сколько времени занимает Query 2, когда вы удаляете 'top 50'? Потому что это то, что выполняется в Query 1. –

ответ

0

Ну со всеми этими регулярными выражениями и множеством строк, вы не можете сделать это, чтобы улучшить это. Я бы сказал, что помещал поле полного текстового поиска или, возможно, очищал ваш вход, поэтому все данные с этим типом регулярного выражения попадают в другую таблицу. В любом случае регулярное выражение очень медленно, если ваша таблица будет продолжать расти, в ближайшее время не ожидается большой производительности.

+2

Это не «регулярное выражение». Это подстановочный поиск. И индексы эффективны, когда литерал поиска появляется в начале поля, например. ' 'SearchString%' '. Однако, если * wildcard * появляется как начало поля, ваш индекс становится бесполезным, например. ''% earchstring'' – Marc

+0

OO интересно TIL спасибо. – memo

1

No.

Во втором запросе вы сделали, если у вас есть 50 записей. В первом запросе вы проверяете все 100.000 записей, а затем извлечь только первый 50.

Теперь, если вы хотите проверить только первые 50 записей попробовать что-то вроде этого:

select a.* 
from 
    (
    select 
row_number() over (order by id desc) as srno 
id,name as myname,* 
    from table 
    ) a 
where srno>=1 and srno<=5 
and (a.name like 'search%' 
or a.column1 like 'search%' 
or a.column2 like 'search%' 
or a.column3 like 'search%' 
or a.column4 like 'search%' 
or a.column5 like 'search%') 
0

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

В первом заявлении вы просматриваете всю таблицу, затем выполняете фильтрацию. Второй оператор просто останавливается, когда он достигает первых 50 записей, что разумно, что он быстрее. Идите со вторым.

0

Сопоставьте значение столбцов, а затем примените оператор LIKE для поиска значения.

SELECT a.* 
FROM (SELECT Row_number() OVER (ORDER BY id DESC) AS srno, 
       id, 
       name         AS myname, 
       * 
     FROM mytable) a 
WHERE (Isnull(a.name, '') + Isnull(a.column1, '') + Isnull(a.column2, '') + 
        Isnull(a.column3, '') + Isnull(a.column4, '') + 
     Isnull(a.column5, '')) LIKE 'search%' 
     AND srno >= 1 
     AND srno <= 50 
+0

Применение LIKE к конкатенированным столбцам сделает любой индекс непригодным для использования. –

+0

Для этого может быть шанс. Они должны создать индекс для всех этих значений. –

+0

Кроме того, это должно быть 'LIKE '% search%" ', поэтому даже с индексом в вычисленном столбце он будет медленнее исходного. –

1

Я не вижу необходимости использовать аналитическую функцию ROW_NUMBER() здесь. Ваши строки могут быть идентифицированы id, и вы, вероятно, используете srn только для ограничения результата до 50 строк. Таким образом, вы можете просто сделать это:

SELECT TOP (50) 
     id 
    , name AS myname 
    , * 
FROM table 
WHERE name LIKE 'search%' 
    OR column1 LIKE 'search%' 
    OR column2 LIKE 'search%' 
    OR column3 LIKE 'search%' 
    OR column4 LIKE 'search%' 
    OR column5 LIKE 'search%' 
ORDER BY id DESC 
Смежные вопросы