какой пример лучше всего использовать индексы - PullRequest
1 голос
/ 28 июля 2011

Использование mssql server 2008. Мне нужно сравнить производительность.У меня нет доступа к анализатору запросов до следующей недели.Это просто сумасшедшая мысль, я хочу знать, какой скрипт будет работать лучше.

Мне интересно, какие скрипты могут использовать индекс txt и почему.

В двух таблицах всего 3 индекса, а в обеих таблицах приблизительно 1 миллион строк

table1(id int(clustered index), name varchar(10))          
table2(t1_id int(non-clustered index), txt varchar(10)(non-clustered index)) 

SQL1: (2 * объединения)

SELECT *
FROM table1 t1 LEFT JOIN
table2 t2 ON t1.id = t2.t1_id
AND NOT t2.txt LIKE 'blue%'
AND NOT t2.txt LIKE 'green%'
INNER JOIN table2 t3 ON t1.id = t3.t1_id
WHERE t2.id is NULL    

SQL2(1 * присоединиться к 1 * 'или')

SELECT *
FROM table1 t1 LEFT JOIN
table2 t2 ON t1.id = t2.t1_id
AND (t2.txt LIKE 'blue%' or t2.txt LIKE 'green%')

Ответы [ 2 ]

1 голос
/ 28 июля 2011

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

SELECT *
FROM table1 t1 
  INNER JOIN table2 t3 ON t1.id = t3.t1_id
WHERE NOT EXISTS (
  SELECT TOP 1 1 
  FROM table2 t2 
  WHERE t1.id = t2.t1_id
    AND NOT t2.txt LIKE 'blue%'
    AND NOT t2.txt LIKE 'green%')

Он гораздо более читабелен и выполняет ту же самую работу, однако вам следует избегать двойных отрицаний («НЕ СУЩЕСТВУЕТ», «НЕ НРАВИТСЯ»), поскольку это затрудняет чтение.

Если производительность второго запроса пригодна для использования или почти одинакова, я бы предложил использовать это.

Также вы подумали о полнотекстовом индексе?

0 голосов
/ 28 июля 2011

Я не думаю, что вы действительно сравниваете яблоки с яблоками здесь;Использование Not Like в одном запросе и Like в другом даст существенную разницу в поведении.оптимизатор вряд ли будет использовать индекс для столбца txt на SQL1 из-за не нравится.Обычно он дает очень неразличимый (или неселективный) запрос.То есть вы фактически просите оптимизатор найти все, что находится в столбце txt, кроме тех значений, которые начинаются с синего или зеленого.Это, вероятно, означает, что вы запрашиваете большинство значений в этом столбце.

Также я не вижу, чтобы соединение с таблицей 2 дважды давало вам что-нибудь.

Конечно, хотя то, что я говорю, может представлять интерес, единственное реальное мнение, которое имеет значение, это мнение плана объяснения.

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