PIMARY KEY CLUSTERED, NONCLUSTERED sul Partitioning

mercoledì 08 ottobre 2008 - 18.24

stepic77 Profilo | Newbie

Ciao a tutti, una tabella del mio db (sql 2005) per esigenze dei clienti, è cresciuta (16 milioni di row per cliente) non indifferentemente.
Il partitioning orizzontale è stata la mia scelta, ora una curiosità.

Senza partizione, la tabella aveva 5 PRIMARY KEY CLUSTERED, dopo aver aggiunto correttamente le partizioni, le PRIMARY KEY sono NONCLUSTERED. Da cosa può dipendere?

alx_81 Profilo | Guru

>Ciao a tutti,
Ciao!
>una tabella del mio db (sql 2005) per esigenze
>dei clienti, è cresciuta (16 milioni di row per cliente) non
>indifferentemente.
>Il partitioning orizzontale è stata la mia scelta, ora una curiosità.
>Senza partizione, la tabella aveva 5 PRIMARY KEY CLUSTERED, dopo
>aver aggiunto correttamente le partizioni, le PRIMARY KEY sono
>NONCLUSTERED. Da cosa può dipendere?
Come hai creato le partizioni? Dovremmo capire come ti sei mosso, perchè sembra che la tua funzione di partizione (che accetta solo un tipo) abbia forzato come cluster l'indice sulla colonna che hai considerato come colonna su cui effettuare il partizionamento.
Prova ad illustrarci come hai proceduto..
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

lbenaglia Profilo | Guru

>Senza partizione, la tabella aveva 5 PRIMARY KEY CLUSTERED,
Alt: la PK per definizione E' UNA SOLTANTO!
Al più avevi una PK costruita su 5 colonne...

>dopo aver aggiunto correttamente le partizioni, le PRIMARY KEY sono
>NONCLUSTERED. Da cosa può dipendere?
Il table partitioning avviene definendo un indice clustered su una colonna specificando un partition scheme.
Partizionando la tabella probabilmente dietro le quinte è stato rimosso l'indice clustered dalla PK per applicarlo alla colonna di partizionamento.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

stepic77 Profilo | Newbie

Allora ragazzi, scusate l'imprecisione sulla primary key... quanto siete fiscali :D
Ho ripetuto i passi su un nuovo database
CREATE PARTITION FUNCTION
CREATE PARTITION SCHEME
etc...

ed ho trovato l'arcano...

Se utilizzo la PRIMARY KEY CLUSTERED alla tabella associandola alla partizione (con solo parte della chiave)
--ON PARTITIONS_PART_PScheme (FK_ID_UTENTE)
il server mi da questo messaggio
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
e non va. Se la PRIMARY KEY la metto NONCLUSTERED va benissimo.

Ora, CLUSTERED ed NONCLUSTERED incidono sulle prestazioni?

lbenaglia Profilo | Guru

>Allora ragazzi, scusate l'imprecisione sulla primary key... quanto
>siete fiscali :D
>Ho ripetuto i passi su un nuovo database
>CREATE PARTITION FUNCTION
>CREATE PARTITION SCHEME
>etc...
>
>ed ho trovato l'arcano...
Noi no dato che non sappiamo come hai partizionato la tabella.
Se vuoi ricevere aiuto devi metterci nella condizione di capire postando tutti i comandi T-SQL.

>Ora, CLUSTERED ed NONCLUSTERED incidono sulle prestazioni?
Ovviamente si. Leggi sui Books Online in cosa differiscono.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

stepic77 Profilo | Newbie

OK, descrivo tutto, e spero di essere più chiaro possibile...

CREAZIONE DEL DB (PART) DI PROVA
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra



Creazione partition function, ADD FILEGROUP e ADD FILE
USE PART ------------------------------------------------------- -- Create the partition function ------------------------------------------------------- --DROP PARTITION FUNCTION PARTITIONS_PART_PFN CREATE PARTITION FUNCTION PARTITIONS_PART_PFN(char(5)) AS --RANGE LEFT FOR VALUES ('03456', '06930') RANGE RIGHT FOR VALUES ('00001') GO ALTER DATABASE PART ADD FILEGROUP [00001] GO ALTER DATABASE PART ADD FILE (NAME = N'PART_00001', FILENAME = N'E:\DATABASE\PART_00001.ndf', SIZE = 1MB, MAXSIZE = unlimited, FILEGROWTH = 5MB) TO FILEGROUP [00001] go




Creazione partition scheme

CREATE PARTITION SCHEME [PARTITIONS_PART_PScheme] AS PARTITION PARTITIONS_PART_PFN TO ([PRIMARY], [00001]) GO ALTER PARTITION SCHEME [PARTITIONS_PART_PScheme] NEXT USED [00001] GO



Creazione tabella associata alla partizione con PRIMARY KEY CLUSTERED

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

FK_ID_UTENTE, FK_ID_AGGR, FK_ID_PAESI_VALUTE, FK_MESE, FK_ANNO
Sono anche riferimenti a chiavi esterne
(FK_ID_UTENTE --> al campo ID_UTENTE della tabella T_UTENTI)

Script popola table

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


i dati vengono caricati su PART.mdf e non sul PART_00001.ndf



DICHIARANDO LA TABELLA direttamente al PARTITIONS_PART_PScheme
funziona bene.

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5