petunjuk noexpand untuk edisi dan kinerja non-enterpise


11

Saya harus menggunakan tampilan Terindeks untuk mencapai kinerja. Seperti yang saya lihat dari tabel perbandingan ini, edisi standar tidak mendukung tampilan yang diindeks. Tapi BOL mengatakan:

Tampilan indeks dapat dibuat dalam edisi SQL Server apa pun. Di SQL Server Enterprise, pengoptimal permintaan secara otomatis mempertimbangkan tampilan yang diindeks. Untuk menggunakan tampilan yang diindeks di semua edisi lain, petunjuk tabel NOEXPAND harus digunakan.

Jadi apakah itu akan berhasil (saya berbicara tentang kinerja)

select * from dbo.OrderTotals with (noexpand, index=IXCU_OrderTotals)

pada SQL Server Standard edition serta berfungsi

select * from dbo.OrderTotals

pada Enterprise satu?

Berikut ini kode untuk dilihat:

CREATE VIEW dbo.OrderTotals
WITH SCHEMABINDING
AS
select 
    OrderId     =   r.OrderId                   
  , TotalQty            =   SUM(r.Quantity)
  , TotalGrossConsid    =   SUM(r.Price * r.Quantity)
  , XCount      =   COUNT_BIG(*)
from dbo.Order r
group by r.OrderId

CREATE UNIQUE CLUSTERED INDEX IXCU_OrderTotals ON OrderTotals (OrderId)

Jawaban:


14

Perbedaannya adalah bahwa edisi Enterprise tanpa petunjuk mungkin memutuskan untuk tidak menggunakan tampilan yang diindeks tetapi tabel dasar sebagai gantinya.

Pengalaman pribadi saya adalah bahwa SQL Server agak sulit dalam hal ini. Saya hampir selalu harus menggunakan petunjuk: kueri lebih cepat dengan IO jauh lebih sedikit meskipun rencana "terlihat" lebih buruk dengan pemindaian pada tampilan tidak indeks mencari pada tabel dasar. Dan itu berjalan lebih konsisten juga

YMMV tentu saja :-)

Jadi, untuk menjawab, itu akan (harus?) Bekerja sama berdasarkan apa yang saya lihat. Orang lain mungkin memiliki pengalaman berbeda dan saya tertarik pada jawaban lain

Untuk menghindari menggunakan petunjuk di mana-mana Anda dapat membungkus tampilan yang diindeks di tampilan lain dengan petunjuk: petunjuk yang merambat ke dalam ke semua kueri luar akan secara otomatis memiliki NOEXPAND.


Saya mendapat "Petunjuk indeks tidak dapat ditentukan dalam objek yang terikat skema" ketika mencoba membuat tampilan luar dengan schemabinding sebagai pilih * dari OrderTotals with (noexpand, index = IXCU_xxx). :)
garik

2
@ garik: Saya hanya perlu NOEXPAND, bukan petunjuk indeks. Hanya ada satu indeks saja: itu berkerumun sehingga table scan = index scan
gbn

tidak ada diskusi. ditutup :)
garik

Woaaa ... menanamkan NOEXPAND ... Cerdas, lalu ...
Jérôme Verstrynge
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.