2009-07-01 10 views
2

Ich versuche, eine Data Warehouse-Anwendung für die Verwendung meiner Firma mit einer partitionierten Datenimporttabelle einzurichten. Ich versuche, ältere Daten zu löschen und Platz für neue Daten zu schaffen. Das ist, wo ich diese Fehlermeldung immer bin:Fehler "Kein identischer Index" beim Wechseln der Datenpartition

Msg 4947, Level 16, State 1, Line 1 ALTER TABLE SWITCH statement failed. There is no identical index in source table 'AssetServer.dbo.IISLog061122' for the index 'IDX_IISLogPartitioned_IP' in target table 'AssetServer.dbo.IISLogPartitioned' . 

Hier ist die Definition des Index sagt, es

dupliziert werden müssen

/****** Objekt: Index [IDX_IISLogPartitioned_IP] Script Datum: 07/01/2009 10.44.45 ******/

CREATE NONCLUSTERED INDEX [IDX_IISLogPartitioned_IP] ON [dbo].[IISLogPartitioned] ( 
[c-ip] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 

Und unten sehen Sie, dass ich einen identischen Index innerhalb der gespeicherten Prozedur erstellen. Ich habe überprüft, dass es erfolgreich erstellt wurde, aber die alter table-Anweisung schlägt mit der obigen Nachricht fehl. Die Hauptschleife des Stored-Verfahrens läuft auf:

ALTER PARTITION FUNCTION fnIISLogRequestTime() SPLIT RANGE ('20090612 01:59:59:000'); 

CREATE TABLE [dbo].[IISLog061201]  
    ([RequestTime] [datetime] NULL,  
    [weekday] [int] NOT NULL,  
    [cs-method] [varchar](50) NOT NULL,  
    [cs-uri-stem] [varchar](255) NOT NULL,  
    [cs-uri-query] [varchar](2048) NULL,  
    [c-ip] [varchar](50) NOT NULL,  
    [cs(Referer)] [varchar](2048) NULL,  
    [cs-host] [varchar](255) NULL,  
    [sc-status] [int] NOT NULL,  
    [sc-substatus] [int] NULL,  
    [sc-bytes] [int] NULL,  
    [cs-bytes] [int] NULL,  
    [time-taken] [int] NULL,  
    [insertiontime] [datetime] NOT NULL,  
    [TimeSinceLast] [int] NULL,  
    [VIP] [varchar](50) NULL) ON [PRIMARY];  



CREATE NONCLUSTERED INDEX [IDX_IISLogPartitioned_IP] ON [dbo].[IISLog061201](
    [c-ip] ASC 
) WITH (
    PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
    SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, 
    DROP_EXISTING = OFF, ONLINE = OFF, 
    ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); 


ALTER TABLE [dbo].[IISLog061201] SWITCH TO IISLogPartitioned PARTITION 7 

Wie kann ich diese Fehlermeldung loswerden?

+0

Wenn Sie eine Antwort erhalten möchten, würde ich versuchen, wenn möglich zu vereinfachen. –

+0

Ich ging voran und vereinfachte die gespeicherte Prozedur. –

Antwort

0

Durch Ihren Text scheint es, dass dieser Code in einer gespeicherten Prozedur ist?

Vielleicht dann ist das Problem, dass die Prozedur irgendwann neu kompiliert wird - bei der es das Indexproblem bemerkt. Auch wenn Sie den Index später erstellen, wird es nicht funktionieren, da die Kompilierung fehlschlägt.

Das gleiche kann passieren, wenn Sie einer Tabelle innerhalb einer Prozedur eine Spalte hinzufügen und später an dieser Spalte teilnehmen: manchmal funktioniert es, weil keine Neukompilierung durchgeführt wird, aber manchmal nicht (z. B. wegen unterschiedlicher Datensätze)) Die Neukompilierung ist abgeschlossen.

Manchmal können solche Probleme mit dynamischem SQL und sp_executesql gelöst werden, oder Sie können Ihren Code in zwei SPs aufteilen. Oder, wenn SP nicht wirklich benötigt wird, machen Sie einfach ein Skript in verschiedene Teile unterteilt.

4

Der Grund, warum Sie den Fehler erhalten, ist, weil die beiden Indizes tatsächlich nicht gleich sind. In den Indizes für die partitionierte Tabelle ist die Partitionierungsspalte in ihren Definitionen enthalten, obwohl Ihr Code dies nicht explizit angegeben hat. (Es ist eine Sache hinter den Kulissen.)

Wenn Sie Partition wechseln möchten, wenn Sie Tabellen partitioniert haben, müssen Ihre Indizes explizit verweisen die Partitionierungsspalte. Ändern Sie den von Ihnen bereitgestellten Index, um RequestTime einzuschließen (vorausgesetzt, das war die Partitionierungsspalte). Sie können es als indizierte Spalte oder einfach als eingeschlossene Spalte haben. Unten geh ich für inklusive.

CREATE NONCLUSTERED INDEX [IDX_IISLogPartitioned_IP] ON [dbo].[IISLog061201](
[c-ip] ASC) INCLUDE (RequestTime) WITH (
PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, 
DROP_EXISTING = OFF, ONLINE = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); 

Jetzt sollte es funktionieren.

+1

Ich stieß auf das gleiche Problem. Das Einbeziehen der Partitionierungsspalte in die Indexierungsspalten hat nicht geholfen. Ich musste es zu den enthaltenen Spalten hinzufügen. – user10633

+0

Sehr gute Antwort und Erklärung, hat mir auch geholfen. –

Verwandte Themen