Итерация по большой таблице с учетом производительности - PullRequest
0 голосов
/ 10 июня 2009

Если мне нужно проверить всю таблицу, чтобы проверить, выполняется ли условие (например, в каждом столбце Ticket есть идентификатор с определенным суффиксом).

Что было бы хорошим способом добиться этого, с точки зрения производительности? Таблица довольно большая, поэтому, если я просматриваю каждую строку, это очень много времени для работы с базой данных. Курсоры медленные, так что это не будет элегантным решением

Кроме того, в будущем вы всегда можете проверить свои параметры, но это не так в прошлом с этим сценарием.

Ответы [ 7 ]

6 голосов
/ 10 июня 2009

псевдо sql (работает в Oracle, синтаксис для других СУБД может отличаться)

 select * from tab where col1 not like '%suffix'

Это даст вам все строки, которые не имеют требуемого суффикса.

2 голосов
/ 10 июня 2009

Что вы пытаетесь сделать с этими строками?

Если просто:

SELECT COUNT(*)
FROM tbl
WHERE col NOT LIKE '%suffix'

Это может быть сканирование таблицы или индексное сканирование.

Это всего лишь один вызов БД, и он возвращает максимум одну строку. БД выполнит работу быстрее, чем любая другая альтернатива.

Если ваша БД изменяется, и вам необходимо регулярно управлять этими критериями и вы хотите сэкономить немного места и обработки во время операций INSERT и UPDATE, вы можете использовать постоянный вычисляемый столбец:

CASE WHERE col LIKE '%suffix' THEN 1 ELSE 0 END

и создайте для этого индекс.

ALTER TABLE tbl
ADD COLUMN IsSuffix AS (
    CASE WHERE col LIKE '%suffix' THEN 1 ELSE 0 END
) PERSISTED NOT NULL

Тогда CREATE INDEX в этом столбце.

1 голос
/ 10 июня 2009

если вы делаете это все время, создайте вычисляемый столбец в REVERSE (YourColumn) и добавьте индекс:

ALTER TABLE dbo.YourTable ADD
    ReverseColumn  AS REVERSE(YourColumn)
GO
CREATE NONCLUSTERED INDEX IX_YourTable_ReverseColumn ON dbo.YourTable 
    (
    ReverseColumn
    ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

используйте это так:

DECLARE @Suffix  varchar(10)
SET @Suffix='abc'

SET @Suffix=REVERSE(@Suffix)+'%'
SELECT * FROM YourTable where ReverseColumn LIKE @Suffix
0 голосов
/ 10 июня 2009

Относительно производительности и сопоставления суффикса с оператором LIKE - это будет относительно медленно, поскольку сопоставление суффиксов не может использовать индекс.

Если вам нужно делать это часто, измените таблицу так, чтобы она содержала поле с обратной строкой TickedID, и добавьте к ней индекс. Например, вы можете добавить триггер, который делает это ПОСЛЕ ВСТАВКИ. Также можно поставить индекс для вычисляемого столбца.

SELECT * FROM tab WHERE TicketIDReverse LIKE REVERSE('%suffix')

соответствует префиксу , так что он может использовать индекс и должен работать быстрее, чем:

SELECT * FROM tab WHERE TicketID LIKE '%suffix'
0 голосов
/ 10 июня 2009

Глядя на SQL, который выдает решение @ Vasu Balakrishnan , если все, что вы хотите знать, - это наличие недопустимых строк, вы можете сделать что-то вроде этого:

SELECT 
    (CASE 
        WHEN EXISTS(
            SELECT NULL AS [Empty]
            FROM [Ticket]
            WHERE [ID] NOT LIKE '%_SUFFIX'
            ) THEN 0
        ELSE 1
     END) AS [AllColumnsAreValid]
0 голосов
/ 10 июня 2009

Я не уверен, что вы ищете предложение в SQL или C #. Если вы хотите что-то в C # с LINQ, вы можете сделать это

pTable.Any(pRow => pRow.Column == someValue)
0 голосов
/ 10 июня 2009

Хорошо спроектированный запрос базы данных к таблице (один с индексом будет еще быстрее) был бы наиболее эффективным и намного лучше, чем пытаться перебрать каждую строку или извлечь всю таблицу. SQL-оператор «лайк» сделает то, что вы описываете.

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