Jak indeksować dane z usługi Azure SQL w usłudze Azure AI Search

Z tego artykułu dowiesz się, jak skonfigurować indeksator , który importuje zawartość z usługi Azure SQL Database lub wystąpienia zarządzanego usługi Azure SQL i umożliwia wyszukiwanie w usłudze Azure AI Search.

Ten artykuł uzupełnia tworzenie indeksatora z informacjami specyficznymi dla usługi Azure SQL. Używa ona interfejsów API REST, aby zademonstrować trzyczęściowy przepływ pracy wspólny dla wszystkich indeksatorów: tworzenie źródła danych, tworzenie indeksu, tworzenie indeksatora.

Ten artykuł zawiera również następujące elementy:

  • Opis zasad wykrywania zmian obsługiwanych przez indeksator usługi Azure SQL, dzięki czemu można skonfigurować indeksowanie przyrostowe.

  • Sekcja często zadawanych pytań (FAQ) zawierająca odpowiedzi na pytania dotyczące zgodności funkcji.

Uwaga

Synchronizacja danych w czasie rzeczywistym nie jest możliwa w przypadku indeksatora. Indeksator może ponownie indeksować tabelę co najwyżej pięć minut. Jeśli aktualizacje danych muszą zostać odzwierciedlone w indeksie wcześniej, zalecamy bezpośrednie wypychanie zaktualizowanych wierszy.

Wymagania wstępne

  • Baza danych Azure SQL Database z danymi w jednej tabeli lub widoku albo wystąpienie zarządzane SQL z publicznym punktem końcowym.

    Użyj tabeli, jeśli dane są duże lub jeśli potrzebujesz indeksowania przyrostowego przy użyciu natywnych możliwości wykrywania zmian w programie SQL.

    Użyj widoku, jeśli chcesz skonsolidować dane z wielu tabel. Duże widoki nie są idealne dla indeksatora SQL. Obejściem jest utworzenie nowej tabeli tylko na potrzeby pozyskiwania danych do indeksu usługi Azure AI Search. Będziesz mieć możliwość korzystania ze zintegrowanego śledzenia zmian SQL, co jest łatwiejsze do zaimplementowania niż wysoki znak wodny.

  • Uprawnienia do odczytu. Usługa Azure AI Search obsługuje uwierzytelnianie programu SQL Server, gdzie w parametry połączenia podano nazwę użytkownika i hasło. Alternatywnie można skonfigurować tożsamość zarządzaną i używać ról platformy Azure.

Aby pracować z przykładami w tym artykule, potrzebny jest klient REST.

Inne podejścia do tworzenia indeksatora usługi Azure SQL obejmują zestawy AZURE SDK lub Kreatora importu danych w witrynie Azure Portal. Jeśli używasz witryny Azure Portal, upewnij się, że dostęp do wszystkich sieci publicznych jest włączony w zaporze Azure SQL Firewall i że klient ma dostęp za pośrednictwem reguły ruchu przychodzącego.

Definiowanie źródła danych

Definicja źródła danych określa dane do indeksowania, poświadczeń i zasad identyfikowania zmian w danych. Źródło danych jest definiowane jako niezależny zasób, dzięki czemu może być używane przez wiele indeksatorów.

  1. Utwórz źródło danych lub zaktualizuj źródło danych, aby ustawić jego definicję:

     POST https://myservice.search.windows.net/datasources?api-version=2020-06-30
     Content-Type: application/json
     api-key: admin-key
    
     {
         "name" : "myazuresqldatasource",
         "description" : "A database for testing Azure AI Search indexes.",
         "type" : "azuresql",
         "credentials" : { "connectionString" : "Server=tcp:<your server>.database.windows.net,1433;Database=<your database>;User ID=<your user name>;Password=<your password>;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;" },
         "container" : { 
             "name" : "name of the table or view that you want to index",
             "query" : null (not supported in the Azure SQL indexer)
             },
         "dataChangeDetectionPolicy": null,
         "dataDeletionDetectionPolicy": null,
         "encryptionKey": null,
         "identity": null
     }
    
  2. Podaj unikatową nazwę źródła danych, która jest zgodna z konwencjami nazewnictwa usługi Azure AI Search.

  3. Ustaw wartość "type" na "azuresql" (wymagane).

  4. Ustaw wartość "credentials" na parametry połączenia:

    • Pełny dostęp parametry połączenia można uzyskać w witrynie Azure Portal. ADO.NET connection string Użyj opcji . Ustaw nazwę użytkownika i hasło.

    • Alternatywnie można określić tożsamość zarządzaną parametry połączenia, która nie zawiera wpisów tajnych bazy danych o następującym formacie: Initial Catalog|Database=<your database name>;ResourceId=/subscriptions/<your subscription ID>/resourceGroups/<your resource group name>/providers/Microsoft.Sql/servers/<your SQL Server name>/;Connection Timeout=connection timeout length;.

    Aby uzyskać więcej informacji, zobacz Połączenie do indeksatora usługi Azure SQL Database przy użyciu tożsamości zarządzanej.

Dodawanie pól wyszukiwania do indeksu

W indeksie wyszukiwania dodaj pola, które odpowiadają polam w bazie danych SQL. Upewnij się, że schemat indeksu wyszukiwania jest zgodny ze schematem źródłowym przy użyciu równoważnych typów danych.

  1. Utwórz lub zaktualizuj indeks , aby zdefiniować pola wyszukiwania, które będą przechowywać dane:

    POST https://[service name].search.windows.net/indexes?api-version=2020-06-30
    Content-Type: application/json
    api-key: [Search service admin key]
    {
        "name": "mysearchindex",
        "fields": [{
            "name": "id",
            "type": "Edm.String",
            "key": true,
            "searchable": false
        }, 
        {
            "name": "description",
            "type": "Edm.String",
            "filterable": false,
            "searchable": true,
            "sortable": false,
            "facetable": false,
            "suggestions": true
        }
      ]
    }
    
  2. Utwórz pole klucza dokumentu ("key": true), które jednoznacznie identyfikuje każdy dokument wyszukiwania. Jest to jedyne pole, które jest wymagane w indeksie wyszukiwania. Zazwyczaj klucz podstawowy tabeli jest mapowany na pole klucza indeksu. Klucz dokumentu musi być unikatowy i inny niż null. Wartości mogą być liczbowe w danych źródłowych, ale w indeksie wyszukiwania klucz jest zawsze ciągiem.

  3. Utwórz więcej pól, aby dodać więcej zawartości z możliwością wyszukiwania. Aby uzyskać wskazówki, zobacz Tworzenie indeksu .

Mapowanie typów danych

Typ danych SQL Typy pól usługi Azure AI Search Uwagi
bitowe Edm.Boolean, Edm.String
int, smallint, tinyint Edm.Int32, Edm.Int64, Edm.String
bigint Edm.Int64, Edm.String
rzeczywiste, zmiennoprzecinkowe Edm.Double, Edm.String
smallmoney, liczba dziesiętna pieniędzy Edm.String Usługa Azure AI Search nie obsługuje konwertowania typów dziesiętnych na Edm.Double , ponieważ spowoduje to utratę precyzji
char, nchar, varchar, nvarchar Edm.String
Collection(Edm.String)
Ciąg SQL może służyć do wypełniania pola Collection(Edm.String), jeśli ciąg reprezentuje tablicę ciągów JSON: ["red", "white", "blue"]
smalldatetime, datetime, datetime2, date, datetimeoffset Edm.DateTimeOffset, Edm.String
uniqueidentifer Edm.String
obszary geograficzne Edm.GeographyPoint Obsługiwane są tylko wystąpienia geograficzne typu POINT ze SRID 4326 (co jest wartością domyślną)
Rowversion Nie dotyczy Kolumny wersji wiersza nie mogą być przechowywane w indeksie wyszukiwania, ale mogą być używane do śledzenia zmian
time, timespan, binary, varbinary, image, xml, geometry, CLR types Nie dotyczy Nieobsługiwane

Konfigurowanie i uruchamianie indeksatora usługi Azure SQL

Po utworzeniu indeksu i źródła danych możesz utworzyć indeksator. Konfiguracja indeksatora określa dane wejściowe, parametry i właściwości kontrolujące zachowania czasu wykonywania.

  1. Utwórz lub zaktualizuj indeksator , podając mu nazwę i odwołując się do źródła danych i indeksu docelowego:

    POST https://[service name].search.windows.net/indexers?api-version=2020-06-30
    Content-Type: application/json
    api-key: [search service admin key]
    {
        "name" : "[my-sqldb-indexer]",
        "dataSourceName" : "[my-sqldb-ds]",
        "targetIndexName" : "[my-search-index]",
        "disabled": null,
        "schedule": null,
        "parameters": {
            "batchSize": null,
            "maxFailedItems": 0,
            "maxFailedItemsPerBatch": 0,
            "base64EncodeKeys": false,
            "configuration": {
                "queryTimeout": "00:04:00",
                "convertHighWaterMarkToRowVersion": false,
                "disableOrderByHighWaterMarkColumn": false
            }
        },
        "fieldMappings": [],
        "encryptionKey": null
    }
    
  2. W obszarze parametry sekcja konfiguracji zawiera parametry specyficzne dla usługi Azure SQL:

    • Domyślny limit czasu zapytania dla wykonywania zapytania SQL wynosi 5 minut, co można zastąpić.

    • Wyrażenie "convertHighWaterMarkToRowVersion" optymalizuje zasady wykrywania zmian znacznika górnego. Zasady wykrywania zmian są ustawiane w źródle danych. Jeśli używasz zasad wykrywania zmian natywnych, ten parametr nie ma efektu.

    • Polecenie "disableOrderByHighWaterMarkColumn" powoduje, że zapytanie SQL używane przez zasady wysokiego znaku wodnego pomija klauzulę ORDER BY. Jeśli używasz zasad wykrywania zmian natywnych, ten parametr nie ma efektu.

  3. Określ mapowania pól, jeśli istnieją różnice w nazwie lub typie pola lub jeśli potrzebujesz wielu wersji pola źródłowego w indeksie wyszukiwania.

  4. Aby uzyskać więcej informacji na temat innych właściwości, zobacz Tworzenie indeksatora .

Indeksator jest uruchamiany automatycznie po jego utworzeniu. Możesz temu zapobiec, ustawiając wartość "disabled" na true. Aby kontrolować wykonywanie indeksatora, uruchom indeksator na żądanie lub umieść go zgodnie z harmonogramem.

Sprawdzanie stanu indeksatora

Aby monitorować stan indeksatora i historię wykonywania, wyślij żądanie pobierz stan indeksatora:

GET https://myservice.search.windows.net/indexers/myindexer/status?api-version=2020-06-30
  Content-Type: application/json  
  api-key: [admin key]

Odpowiedź zawiera stan i liczbę przetworzonych elementów. Powinien on wyglądać podobnie do poniższego przykładu:

    {
        "status":"running",
        "lastResult": {
            "status":"success",
            "errorMessage":null,
            "startTime":"2022-02-21T00:23:24.957Z",
            "endTime":"2022-02-21T00:36:47.752Z",
            "errors":[],
            "itemsProcessed":1599501,
            "itemsFailed":0,
            "initialTrackingState":null,
            "finalTrackingState":null
        },
        "executionHistory":
        [
            {
                "status":"success",
                "errorMessage":null,
                "startTime":"2022-02-21T00:23:24.957Z",
                "endTime":"2022-02-21T00:36:47.752Z",
                "errors":[],
                "itemsProcessed":1599501,
                "itemsFailed":0,
                "initialTrackingState":null,
                "finalTrackingState":null
            },
            ... earlier history items
        ]
    }

Historia wykonywania zawiera do 50 ostatnio wykonanych wykonań, które są sortowane w odwrotnej kolejności chronologicznej, tak aby najnowsze wykonanie było wykonywane jako pierwsze.

Indeksowanie nowych, zmienionych i usuniętych wierszy

Jeśli baza danych SQL obsługuje śledzenie zmian, indeksator wyszukiwania może pobrać tylko nową i zaktualizowaną zawartość na kolejnych uruchomieniach indeksatora.

Aby włączyć indeksowanie przyrostowe, ustaw właściwość "dataChangeDetectionPolicy" w definicji źródła danych. Ta właściwość informuje indeksator, który mechanizm śledzenia zmian jest używany w tabeli lub widoku.

W przypadku indeksatorów usługi Azure SQL istnieją dwie zasady wykrywania zmian:

  • "SqlIntegratedChangeTrackingPolicy" (dotyczy tylko tabel)

  • "HighWaterMarkChangeDetectionPolicy" (działa w przypadku tabel i widoków)

Zintegrowane zasady śledzenia zmian SQL

Zalecamy użycie wartości "SqlIntegratedChangeTrackingPolicy" pod kątem wydajności i możliwości identyfikowania usuniętych wierszy.

Wymagania dotyczące bazy danych:

  • Program SQL Server 2012 SP3 lub nowsza wersja, jeśli używasz programu SQL Server na maszynach wirtualnych platformy Azure
  • Usługa Azure SQL Database lub wystąpienie zarządzane SQL
  • Tylko tabele (bez widoków)
  • W bazie danych włącz śledzenie zmian dla tabeli
  • Brak złożonego klucza podstawowego (klucz podstawowy zawierający więcej niż jedną kolumnę) w tabeli
  • Brak indeksów klastrowanych w tabeli. Obejście tego problemu wymagałoby usunięcia i ponownego utworzenia indeksu klastrowanego jako indeksu nieklastrowanego, jednak może to mieć wpływ na wydajność w źródle w porównaniu z indeksem klastrowanym

Zasady wykrywania zmian są dodawane do definicji źródła danych. Aby użyć tych zasad, utwórz lub zaktualizuj źródło danych w następujący sposób:

POST https://myservice.search.windows.net/datasources?api-version=2020-06-30
Content-Type: application/json
api-key: admin-key
    {
        "name" : "myazuresqldatasource",
        "type" : "azuresql",
        "credentials" : { "connectionString" : "connection string" },
        "container" : { "name" : "table name" },
        "dataChangeDetectionPolicy" : {
            "@odata.type" : "#Microsoft.Azure.Search.SqlIntegratedChangeTrackingPolicy"
    }

W przypadku korzystania z zintegrowanych zasad śledzenia zmian SQL nie należy określać oddzielnych zasad wykrywania usuwania danych. Zintegrowane zasady śledzenia zmian SQL mają wbudowaną obsługę identyfikowania usuniętych wierszy. Jednak aby usunięte wiersze zostały wykryte automatycznie, klucz dokumentu w indeksie wyszukiwania musi być taki sam jak klucz podstawowy w tabeli SQL.

Uwaga

W przypadku usuwania dużej liczby wierszy z tabeli SQL przy użyciu narzędzia TRUNCATE , indeksator musi zostać zresetowany , aby zresetować stan śledzenia zmian w celu pobrania usunięcia wierszy.

Zasady wykrywania zmian znacznika górnego limitu wody

Te zasady wykrywania zmian opierają się na kolumnie "wysoki znacznik wody" w tabeli lub widoku, który przechwytuje wersję lub godzinę ostatniej aktualizacji wiersza. Jeśli używasz widoku, musisz użyć zasad wysokiego znaku wodnego.

Kolumna wysokiego limitu wody musi spełniać następujące wymagania:

  • Wszystkie wstawki określają wartość kolumny.
  • Wszystkie aktualizacje elementu również zmieniają wartość kolumny.
  • Wartość tej kolumny jest zwiększana przy każdym wstawieniu lub aktualizacji.
  • Zapytania z następującymi klauzulami WHERE i ORDER BY można wykonywać wydajnie: WHERE [High Water Mark Column] > [Current High Water Mark Value] ORDER BY [High Water Mark Column]

Uwaga

Zdecydowanie zalecamy użycie typu danych rowversion dla kolumny wysokiego limitu wody. Jeśli jest używany jakikolwiek inny typ danych, śledzenie zmian nie gwarantuje przechwycenia wszystkich zmian w obecności transakcji wykonywanych współbieżnie za pomocą zapytania indeksatora. W przypadku używania elementu rowversion w konfiguracji z replikami tylko do odczytu należy wskazać indeksator w repliki podstawowej. Tylko replika podstawowa może służyć do scenariuszy synchronizacji danych.

Zasady wykrywania zmian są dodawane do definicji źródła danych. Aby użyć tych zasad, utwórz lub zaktualizuj źródło danych w następujący sposób:

POST https://myservice.search.windows.net/datasources?api-version=2020-06-30
Content-Type: application/json
api-key: admin-key
    {
        "name" : "myazuresqldatasource",
        "type" : "azuresql",
        "credentials" : { "connectionString" : "connection string" },
        "container" : { "name" : "table or view name" },
        "dataChangeDetectionPolicy" : {
            "@odata.type" : "#Microsoft.Azure.Search.HighWaterMarkChangeDetectionPolicy",
            "highWaterMarkColumnName" : "[a rowversion or last_updated column name]"
        }
    }

Uwaga

Jeśli tabela źródłowa nie ma indeksu w kolumnie wysokiego znacznika wody, zapytania używane przez indeksator SQL mogą przekraczać limit czasu. W szczególności klauzula ORDER BY [High Water Mark Column] wymaga wydajnego uruchomienia indeksu, gdy tabela zawiera wiele wierszy.

convertHighWaterMarkToRowVersion

Jeśli używasz typu danych rowversion dla kolumny wysokiego limitu wody, rozważ ustawienie convertHighWaterMarkToRowVersion właściwości w konfiguracji indeksatora. Ustawienie tej właściwości na true powoduje następujące zachowania:

  • Używa typu danych rowversion dla kolumny wysokiego limitu wody w zapytaniu SQL indeksatora. Użycie poprawnego typu danych zwiększa wydajność zapytań indeksatora.

  • Odejmuje jedną z wartości rowversion przed uruchomieniem zapytania indeksatora. Widoki ze sprzężeniami jeden do wielu mogą zawierać wiersze z zduplikowanymi wartościami rowversion. Odejmowanie jednego gwarantuje, że zapytanie indeksatora nie przegapi tych wierszy.

Aby włączyć tę właściwość, utwórz lub zaktualizuj indeksator przy użyciu następującej konfiguracji:

    {
      ... other indexer definition properties
     "parameters" : {
            "configuration" : { "convertHighWaterMarkToRowVersion" : true } }
    }

Querytimeout

Jeśli wystąpią błędy przekroczenia limitu czasu, ustaw queryTimeout ustawienie konfiguracji indeksatora na wartość wyższą niż domyślny limit czasu 5-minutowy. Aby na przykład ustawić limit czasu na 10 minut, utwórz lub zaktualizuj indeksator przy użyciu następującej konfiguracji:

    {
      ... other indexer definition properties
     "parameters" : {
            "configuration" : { "queryTimeout" : "00:10:00" } }
    }

disableOrderByHighWaterMarkColumn

Możesz również wyłączyć klauzulę ORDER BY [High Water Mark Column] . Nie jest to jednak zalecane, ponieważ jeśli wykonanie indeksatora zostanie przerwane przez błąd, indeksator musi ponownie przetworzyć wszystkie wiersze, jeśli zostanie uruchomiony później, nawet jeśli indeksator przetworzył już prawie wszystkie wiersze w czasie jego przerwania. Aby wyłączyć klauzulę ORDER BYdisableOrderByHighWaterMarkColumn , użyj ustawienia w definicji indeksatora:

    {
     ... other indexer definition properties
     "parameters" : {
            "configuration" : { "disableOrderByHighWaterMarkColumn" : true } }
    }

Zasady wykrywania usuwania kolumn nietrwałych

Po usunięciu wierszy z tabeli źródłowej prawdopodobnie chcesz również usunąć te wiersze z indeksu wyszukiwania. Jeśli używasz zintegrowanych zasad śledzenia zmian SQL, jest to dla Ciebie potrzebne. Jednak zasady śledzenia zmian z wysokim znacznikiem wody nie ułatwiają usuwania wierszy. Postępowanie

Jeśli wiersze są fizycznie usuwane z tabeli, usługa Azure AI Search nie ma możliwości wnioskowania o obecności rekordów, które już nie istnieją. Można jednak użyć techniki "usuwania nietrwałego", aby logicznie usunąć wiersze bez usuwania ich z tabeli. Dodaj kolumnę do tabeli lub widoku i oznacz wiersze jako usunięte przy użyciu tej kolumny.

W przypadku korzystania z techniki usuwania nietrwałego można określić zasady usuwania nietrwałego w następujący sposób podczas tworzenia lub aktualizowania źródła danych:

    {
        …,
        "dataDeletionDetectionPolicy" : {
           "@odata.type" : "#Microsoft.Azure.Search.SoftDeleteColumnDeletionDetectionPolicy",
           "softDeleteColumnName" : "[a column name]",
           "softDeleteMarkerValue" : "[the value that indicates that a row is deleted]"
        }
    }

SoftDeleteMarkerValue musi być ciągiem w reprezentacji JSON źródła danych. Użyj reprezentacji ciągu rzeczywistej wartości. Jeśli na przykład masz kolumnę całkowitą, w której usunięte wiersze są oznaczone wartością 1, użyj wartości "1". Jeśli masz kolumnę BIT, w której usunięte wiersze są oznaczone wartością true wartości logicznej, użyj literału "True" ciągu lub "true", wielkość liter nie ma znaczenia.

Jeśli konfigurujesz zasady usuwania nietrwałego z witryny Azure Portal, nie dodawaj cudzysłowów wokół wartości znacznika usuwania nietrwałego. Zawartość pola jest już rozumiana jako ciąg i zostanie automatycznie przetłumaczona na ciąg JSON. W powyższych przykładach po prostu wpisz 1, True lub true w polu portalu.

Często zadawane pytania

Pyt.: Czy mogę indeksować kolumny Always Encrypted?

L.p. Kolumny Always Encrypted nie są obecnie obsługiwane przez indeksatory usługi Azure AI Search.

Pyt.: Czy mogę używać indeksatora Azure SQL z bazami danych SQL działającymi na maszynach wirtualnych IaaS na platformie Azure?

Tak. Należy jednak zezwolić usłudze wyszukiwania na łączenie się z bazą danych. Aby uzyskać więcej informacji, zobacz Konfigurowanie połączenia z indeksatora usługi Azure AI Search do programu SQL Server na maszynie wirtualnej platformy Azure.

Pyt.: Czy mogę używać indeksatora Azure SQL z bazami danych SQL działającymi lokalnie?

Nie bezpośrednio. Nie zalecamy ani nie obsługujemy bezpośredniego połączenia, ponieważ wymaga to otwarcia baz danych na ruch internetowy. Klienci odnieśli sukces w tym scenariuszu przy użyciu technologii mostka, takich jak Azure Data Factory. Aby uzyskać więcej informacji, zobacz Wypychanie danych do indeksu usługi Azure AI Search przy użyciu usługi Azure Data Factory.

Pyt.: Czy mogę użyć repliki pomocniczej w klastrze trybu failover jako źródła danych?

To zależy. Aby uzyskać pełne indeksowanie tabeli lub widoku, można użyć repliki pomocniczej.

W przypadku indeksowania przyrostowego usługa Azure AI Search obsługuje dwie zasady wykrywania zmian: zintegrowane śledzenie zmian SQL i wysoki znak wodny.

W replikach tylko do odczytu usługa SQL Database nie obsługuje zintegrowanego śledzenia zmian. W związku z tym należy użyć zasad High Water Mark.

Naszym standardowym zaleceniem jest użycie typu danych rowversion dla kolumny wysokiego limitu wody. Jednak użycie funkcji rowversion opiera się na MIN_ACTIVE_ROWVERSION funkcji, która nie jest obsługiwana w replikach tylko do odczytu. W związku z tym należy wskazać indeksator do repliki podstawowej, jeśli używasz funkcji rowversion.

Jeśli spróbujesz użyć elementu rowversion w repliki tylko do odczytu, zostanie wyświetlony następujący błąd:

"Używanie kolumny rowversion do śledzenia zmian nie jest obsługiwane w pomocniczych replikach dostępności (tylko do odczytu). Zaktualizuj źródło danych i określ połączenie z repliką dostępności podstawowej. Bieżąca właściwość "Updateability" bazy danych to "READ_ONLY".

Pyt.: Czy mogę użyć alternatywnej kolumny innej niż rowversion na potrzeby śledzenia zmian znacznika górnego limitu wody?

Nie jest to zalecane. Tylko wersja wiersza umożliwia niezawodną synchronizację danych. Jednak w zależności od logiki aplikacji może to być bezpieczne, jeśli:

  • Możesz upewnić się, że po uruchomieniu indeksatora nie ma zaległych transakcji w tabeli indeksowanej (na przykład wszystkie aktualizacje tabel są wykonywane jako partia zgodnie z harmonogramem, a harmonogram indeksatora usługi Azure AI Search jest ustawiony, aby uniknąć nakładania się na harmonogram aktualizacji tabeli).

  • Okresowo wykonujesz pełne ponowne indeksowanie, aby odebrać wszystkie pominięte wiersze.