Adakah yang menggunakan HierarchyId dalam produksi? Apakah ini dapat diandalkan?

21

Apakah ada yang menggunakan HierarchyId dalam produksi nyata dengan tabel ukuran yang masuk akal, lebih dari beberapa ribu baris? Apakah dapat diandalkan / performan? Sejauh ini saya belum menemukan orang yang berafiliasi dengan vendor merekomendasikannya, dan Paul Nielsen menyarankan untuk tidak melakukannya di sini .

Apa pengalaman Anda menggunakan HierarchyId dalam sistem produksi aktual?

Kriteria apa yang telah Anda gunakan ketika Anda memilih HierarchyId daripada alternatifnya?

AK
sumber

Jawaban:

8

Saya telah mengimplementasikan HierarchyID dan menemukannya untuk memberikan kinerja yang baik dan mudah digunakan.

Saya telah menggunakannya pada dataset yang relatif kecil (puluhan ribu baris) dengan hierarki hingga 10 cabang.

Kenapa menggunakannya? Tipe HierarchyID menyediakan sejumlah metode penolong (seperti IsDescendantOf) yang membuat pekerjaan Anda lebih mudah daripada menggulirkan jalur terwujud Anda sendiri.

Komentar Paul Nielsen tentang StackOverflow membingungkan saya - HierarchyID adalah jalan yang terwujud. Saya lebih cenderung setuju dengan komentar ini di bawah jawabannya.

Pertanyaan yang lebih baik mungkin 'mengapa tidak menggunakannya'. Mudah digunakan, menyediakan banyak fungsionalitas yang seharusnya dapat Anda tulis sendiri, dan berkinerja baik (dalam tes terbatas saya).

Kirk Broadhurst
sumber
+1 Bagaimana Anda memastikan integritas data Anda? Bisakah Anda menggunakan batasan untuk memastikan tidak ada anak yatim?
AK
3
Dari memori Anda bisa. Anda akan menggunakan fungsi melintasi HierarchyID untuk menentukan nilai induk, membuat kolom yang dihitung terus-menerus untuk nilai itu, dan kemudian menerapkan batasan FK antara nilai itu dan induknya.
Kirk Broadhurst
5

Ini adalah jawaban untuk pertanyaan Kirk 'mengapa tidak menggunakannya (HierarchyId)'. Dibandingkan dengan jalur terwujud, dalam beberapa kasus penting HierarchyId tampaknya kurang berkinerja dan kurang nyaman untuk bekerja dengannya.

Alasannya sederhana: mengutip dari komentar Microsoft pada Connect , "Masalahnya adalah bahwa panggilan CLR, termasuk metode hierarkiID, tidak jelas untuk pengoptimal kueri. Ini adalah desain. Namun, itu berarti bahwa perkiraan kardinalitas untuk mereka kadang-kadang bisa sangat salah."

Di sisi lain, mengimplementasikan jalur terwujud sangat mudah saat pertama kali kita perlu melakukannya, dan lain kali pada dasarnya merupakan tugas salin dan tempel. Jadi, kami mendapatkan solusi yang lebih fleksibel dan berkinerja lebih baik dengan sedikit usaha.

Jadi saya sepenuhnya setuju dengan Paul Nielsen, yang menulis dalam bukunya yang sangat bagus yang berjudul "Microsoft® SQL Server® 2008 Bible" sebagai berikut: "HierarchyID baru bukan tanpa kontroversi. Ini baru dan mendapat banyak waktu pers dan demo, tetapi saya ' Saya tidak yakin itu masalah yang membutuhkan solusi lain. "

AK
sumber
3

Perusahaan saya menggunakan HeirachyID dalam penjualan langsung, perangkat lunak pemasaran multi-level. Berhasil. Saya belum benar-benar melakukan pekerjaan dengan itu saya hanya tahu kami menggunakannya.

Masalah terbesar yang saya lihat dengan itu adalah bahwa kita melakukan iterasi melalui level-level secara looping alih-alih lebih berbasis set. Di area itu, performanya tidak terlalu bagus untuk kami, tapi saya tidak yakin apakah itu masalah dengan tipe atau implementasi kami.

Jack Corbett
sumber
Jack, seberapa besar meja Anda? Bagaimana Anda memilih untuk menggunakan HierarchyId daripada alternatifnya?
AK
Karena saya tidak mengaktifkan notifikasi email, saya tidak pernah melihat komentar ini. Tabel kami ada dalam ratusan ribu saat ini bukan jutaan. Saya tidak bersama perusahaan ketika keputusan untuk menggunakan HierarchyID dibuat, jadi saya tidak yakin mengapa itu dipilih, selain itu cara baru pada saat itu.
Jack Corbett
1

Satu masalah dengan hierarki adalah Anda mendapatkan vendor lock-in. Tapi saya memang menemukan artikel hebat oleh Adam Milazzo tentang bagaimana semuanya bekerja secara internal:

http://www.adammil.net/blog/view.php?id=100

Dengan ini saya bisa menulis skrip Postgres untuk mengonversi set data saya dari MSSQL. Juga disertakan dalam skrip yang saya tulis untuk mengimpor database AdventureWorks ke Postgres:

https://github.com/lorint/AdventureWorks-for-Postgres

Cukup cari "hierarkiid" di file install.sql di sana dan Anda akan segera menemukan referensi untuk mengubahnya.

Lorin Menunggu
sumber
0

Tim kami telah menerapkannya dalam produksi, pada awalnya kinerjanya baik, setelah 2 tahun, tabel sekarang berisi 430.000 baris dan getroot dan getdecendent membutuhkan waktu 3 detik, keduanya diperlukan untuk menghitung nilai Id berikutnya untuk memasukkan catatan. Sekarang penyisipan subtree tunggal membutuhkan waktu sekitar 16 detik yang tidak dapat diterima sama sekali.

gavin
sumber