SQL Server - индексирует на вычисляемом столбце?

Не уверенный в получении IntPtr к массиву, но можно скопировать данные для использования с неуправляемым кодом при помощи Mashal. Копия:

IntPtr unmanagedPointer = Marshal.AllocHGlobal(bytes.Length);
Marshal.Copy(bytes, 0, unmanagedPointer, bytes.Length);
// Call unmanaged code
Marshal.FreeHGlobal(unmanagedPointer);

, Кроме того, Вы могли объявить структуру с одним свойством и затем использовать Маршала. PtrToStructure, но это все еще потребовало бы выделяющей неуправляемой памяти.

Редактирование: кроме того, как Tyalis указал, можно также использовать , зафиксировал , если небезопасный код является опцией для Вас

16
задан SqlRyan 24 August 2009 в 21:40
поделиться

4 ответа

Предполагая, что у вас есть поля в этом формате:

00Data0007
000000Data0011
0000Data0015

, вы можете сделать следующее:

  • Создать вычисляемый столбец: ndata AS RIGHT (REVERSE (data), LEN (data) - 4)

    Это преобразует ваши столбцы в следующие:

     ataD00
    ataD000000
    ataD0000
    
  • Создайте индекс для этого столбца

  • Выполните этот запрос для поиска строки Data :

     SELECT *
    ИЗ mytable
    ГДЕ ndata LIKE N'ataD% '
     И ПОДСТРОКА (ndata, LEN (N'ataD ') + 1, LEN (ndata)) = REPLICATE (' 0 ', LEN (ndata) - LEN (' ataD '))
    

    Первое условие будет использовать индекс для грубой фильтрации.

    Второе гарантирует, что все начальные символы (которые стали конечными символами в вычисляемом столбце) не что иное, как нули.

См. Эту запись в моем блог для подробностей о производительности:

Обновление

Если вам нужен только индекс для SUBSTRING без изменения схемы, создание представления вариант.

CREATE VIEW v_substring75
WITH SCHEMABINDING
AS
SELECT  s.id, s.data, SUBSTRING(data, 7, 5) AS substring75
FROM    mytable

CREATE UNIQUE CLUSTERED INDEX UX_substring75_substring_id ON (substring75, id)

SELECT  id, data
FROM    v_substring75
WHERE   substring75 = '12345'
13
ответ дан 30 November 2019 в 22:17
поделиться

Добавьте вычисляемый столбец в свою таблицу и создайте индекс для этого столбца.

ALTER TABLE MyTable
Add Column CodeHead As LEFT(Code,Len(Code)-4)

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

CREATE INDEX CodeHeadIdx ON MyTable.CodeHead
6
ответ дан 30 November 2019 в 22:17
поделиться

Можете ли вы перефразировать критерии фильтрации в терминах LIKE 'something%' утверждения? (Это применимо к индексу)

1
ответ дан 30 November 2019 в 22:17
поделиться

Измените столбец на два столбца - данные, которые вы объединяете, и дополнительные 4 символа. Использование частей колонны замедляет работу, как вы видели

0
ответ дан 30 November 2019 в 22:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: