Можно ли выполнить этот запрос для поиска в базе данных ячеек электронной таблицы быстрее? - PullRequest
0 голосов
/ 08 декабря 2011

У меня есть каждая ячейка коллекции электронных таблиц в таблице.

CREATE TABLE [dbo].[SheetRow](
    [Id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [DocumentName] [varchar](max) NULL,
    [SheetName] [varchar](max) NULL,
    [RowNumber] [varchar](max) NULL,
    [ColumnNumber] [varchar](max) NULL,
    [Value] [varchar](max) NULL)

И запрос для поиска всех строк ячеек со значениями, соответствующими определенной строке:

select *
from sheetrow a 
inner join sheetrow b
on
    a.value like '%starting balance%' and
    a.DocumentName=b.DocumentName and
    a.SheetName=b.SheetName and
    a.RowNumber=b.RowNumber

При наличии ячейки 34K (строк) в таблице запрос занял 41 секунду.

Есть ли очевидный лучший / быстрый способ получить тот же результат?

Ответы [ 2 ]

1 голос
/ 08 декабря 2011

Каждый раз, когда вы используете запрос LIKE с подстановочным знаком в начале, например, '%starting balance%' в вашем примере, вы уничтожаете способность оптимизатора использовать любые индексы для ускорения запроса.Так что, если вы можете быть уверены, что искомая ячейка начнется с «Стартовый баланс», вы можете удалить первый подстановочный знак и использовать любые индексы в столбце value.

Говоря об индексах,Вы могли бы попытаться создать некоторые.Я не эксперт, но я бы попробовал один на value и один для других 3 столбцов в вашем условии соединения (DocumentName, SheetName и RowNumber), чтобы начать с.

При попытке определить причину медленного запроса, хорошим первым шагом будет запустить SQL:

SET IO STATISTICS ON
GO

в используемом вами окне запроса, а затем выполнить запрос.Также включите фактический план выполнения перед выполнением запроса.Как только запрос будет выполнен, вы сможете увидеть подробную статистику на вкладке «Сообщения» и захотите найти таблицы с действительно высоким логическим чтением, физическим чтением или количеством сканирований.Затем посмотрите, есть ли в плане выполнения дорогостоящие операции, работающие с этими таблицами, и посмотрите, есть ли способ повысить эффективность этой операции.

Последний совет при попытке выяснить, почему запросы выполняются медленно:Установите и используйте бесплатный инструмент SQL Sentry Plan Explorer , чтобы получить более подробное и полезное представление планов выполнения. sooo окажется гораздо более полезным, чем средство просмотра плана выполнения по умолчанию в SSMS.

0 голосов
/ 08 декабря 2011

Не думай, что я понимаю, что ты пытаешься сделать.Зачем вам нужно, чтобы один лист присоединился к другому?Разве это не может быть просто:

select *
from sheetrow a 
where a.value like '%starting balance%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...