Nano Hash - криптовалюты, майнинг, программирование

Итерация по большой таблице с учетом производительности

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

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

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


Ответы:


1

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

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

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

10.06.2009

2

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

Если только:

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 в этом столбце.

10.06.2009
  • Как мне создать индекс для запроса? И все, что мне нужно сделать, это проверить значение (для префикса). Спасибо 10.06.2009
  • Это будет постоянный столбец в таблице, и вы должны создать индекс для таблицы, используя этот столбец. Если это префикс, а не суффикс (LIKE 'prefix%'), то будет использоваться индекс этого столбца, и в этом нет необходимости. 10.06.2009

  • 3

    если вы делаете это все время, создайте вычисляемый столбец в 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
    
    10.06.2009
  • Я сделал это для столбцов, в которых пользователи выполняют поиск по длинным буквенно-цифровым кодам продуктов, но просто хотят ввести последние несколько цифр. Они возвращают несколько неправильных строк в результатах поиска, но могут легко выбрать правильную. 10.06.2009

  • 4

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

    10.06.2009

    5

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

    pTable.Any(pRow => pRow.Column == someValue)
    
    10.06.2009


    7

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

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

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

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

    SELECT * FROM tab WHERE TicketID LIKE '%suffix'
    
    10.06.2009
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..