ผู้ดูแลฐานข้อมูล

ถามตอบสำหรับผู้เชี่ยวชาญด้านฐานข้อมูลที่ต้องการพัฒนาทักษะฐานข้อมูลและเรียนรู้จากผู้อื่นในชุมชน

1
สั่งช้าโดย SQL Server
ในแอปพลิเคชันของฉันฉันมีคิวรีซึ่งทำการค้นหาในตาราง "ไฟล์" ตาราง "files" ถูกแบ่งพาร์ติชันโดย "f". "created" (ดูคำจำกัดความของตารางและมีแถว ~ 26 ล้านแถวสำหรับไคลเอ็นต์ 19 ("f". "cid = 19) จุดนี่คือถ้าฉันทำแบบสอบถามนี้: SELECT "f"."id" AS "FileId" , "f"."name" AS "FileName" , "f"."year" AS "Fileyear" , "f"."cid" AS "clientId" , "f"."created" AS "FileDate" , CASE WHEN ("vnVE0"."value" is not null AND "vnVE0"."value" != '') THEN CAST("vnVE0"."value" …

1
จะกรองการใช้ฟังก์ชันที่ผู้ใช้กำหนดเองของ Scalar จากข้อมูลการตรวจสอบเซิร์ฟเวอร์ SQL ได้อย่างไร
เรามีฐานข้อมูล SQL Server ซึ่งมีข้อกำหนดการตรวจสอบฐานข้อมูลที่ตรวจสอบการดำเนินการทั้งหมดในฐานข้อมูล CREATE DATABASE AUDIT SPECIFICATION [dbAudit] FOR SERVER AUDIT [servAudit] ADD (EXECUTE ON DATABASE::[DatabaseName] BY [public]) เราพบว่าแบบสอบถามบางข้อจะเขียนลงในบันทึกการตรวจสอบโดยใช้ฟังก์ชั่นสเกลาร์สำหรับทุกแถวในชุดผลลัพธ์ เมื่อสิ่งนี้เกิดขึ้นบันทึกจะเต็มก่อนที่เราจะสามารถ ETL ลงในที่ซึ่งเป็นสถานที่พักผ่อนขั้นสุดท้ายและเรามีช่องว่างในการบันทึกของเรา น่าเสียดายเนื่องจากเหตุผลด้านความสอดคล้องเราไม่สามารถหยุดการตรวจสอบทุกEXECUTEคำสั่งได้ ความคิดแรกของเราสำหรับแนวทางในการแก้ไขปัญหานี้คือการใช้WHEREข้อในการตรวจสอบเซิร์ฟเวอร์เพื่อกรองกิจกรรม รหัสดูเหมือนว่านี้: WHERE [object_id] not in (Select object_id from sys.objects where type = 'FN' ) น่าเสียดายที่ SQL Server ไม่อนุญาตให้ตัวดำเนินการสัมพันธ์ (อาจเป็นเพราะมันไม่ต้องการสอบถามทุกครั้งที่มีการเขียนไปยังบันทึกการตรวจสอบ) เราต้องการหลีกเลี่ยงการเขียน proc ที่เก็บไว้ซึ่งเป็นรหัสที่ยากobject_idในWHEREข้อ แต่นั่นคือความคิดของเราในปัจจุบันเกี่ยวกับวิธีที่ดีที่สุดในการแก้ไขปัญหานี้ มีวิธีอื่นที่เราควรพิจารณาหรือไม่? เราสังเกตเห็นว่าเมื่อฟังก์ชั่นสเกลาร์ถูกใช้ใน …

3
จำลองฟังก์ชันสเกลาร์ที่ผู้ใช้กำหนดในลักษณะที่ไม่ได้ป้องกันการขนาน
ฉันพยายามดูว่ามีวิธีการหลอกลวง SQL Server ให้ใช้แผนบางอย่างสำหรับแบบสอบถามหรือไม่ 1. สภาพแวดล้อม ลองนึกภาพคุณมีข้อมูลบางอย่างที่ใช้ร่วมกันระหว่างกระบวนการที่แตกต่างกัน สมมติว่าเรามีผลการทดสอบบางอย่างซึ่งใช้พื้นที่มาก จากนั้นสำหรับแต่ละขั้นตอนเรารู้ว่าต้องการใช้ปี / เดือนใด if object_id('dbo.SharedData') is not null drop table SharedData create table dbo.SharedData ( experiment_year int, experiment_month int, rn int, calculated_number int, primary key (experiment_year, experiment_month, rn) ) go ตอนนี้สำหรับทุกกระบวนการเรามีพารามิเตอร์ที่บันทึกไว้ในตาราง if object_id('dbo.Params') is not null drop table dbo.Params create table dbo.Params …

1
เหตุใดจึงตัดทอนตาราง temp ที่ส่วนท้ายของโพรซีเดอร์ที่เก็บไว้ซึ่งสร้างพื้นที่ว่าง tempdb ให้เร็วขึ้น?
SQL Server แคชตาราง temp ที่สร้างขึ้นภายในโพรซีเดอร์ที่เก็บไว้และเปลี่ยนชื่อเพียงเมื่อโพรซีเดอร์สิ้นสุดลงและถูกเรียกใช้งานในภายหลัง คำถามของฉันเกี่ยวกับเมื่อมีการปล่อยพื้นที่ tempdb ผมเคยอ่านว่าตารางจะถูกตัดทอนในตอนท้ายของขั้นตอนที่ ฉันได้อ่านความคิดเห็นว่าสิ่งนี้ได้รับการจัดการในแต่ละช่วงและเห็นคำถามว่าจำเป็นต้องตอบคำถามเกี่ยวกับการล้างข้อมูลบน MSDNหรือไม่ แต่ถ้าหากมันไม่ถูกดำเนินการโดยเซสชั่นเดียวกันสองครั้ง? ฉันเคยได้ยินว่ามีกระบวนการเก็บรวบรวมขยะในพื้นหลังที่ทำให้มีพื้นที่ว่างเมื่อตารางไม่อยู่ในขอบเขต การตัดทอนตาราง temp ที่ส่วนท้ายของโพรซีเดอร์ที่เก็บไว้ซึ่งทำให้ดูเหมือนว่าพื้นที่ที่ตารางใช้ใน tempdb สำหรับข้อมูลที่จะเผยแพร่เร็วกว่าถ้าไม่มีการใช้คำสั่ง truncate แม้จะมีความคาดหวังที่ตรงกันข้าม ทำไม? อะไรคือความสัมพันธ์ของประสิทธิภาพในการใช้งานหรือไม่ใช้คำสั่งตัดทอน เมื่อใช้การแยก SNAPSHOT, tempdb มักจะเครียดและฉันคิดว่าการปล่อยพื้นที่ที่ใช้ใน tempdb จากตาราง tempdb ขนาดใหญ่โดยเร็วที่สุดจะช่วยป้องกันไม่ให้ tempdb เติบโตอย่างไม่จำเป็น การประหยัดพื้นที่ที่มีศักยภาพนี้จะมาพร้อมกับประสิทธิภาพหรือไม่ นี่คือรหัสบางส่วนในการทำซ้ำปัญหา (ส่วนใหญ่มาจาก @TheGameiswar โดยมีการเปลี่ยนแปลงบางอย่าง): SET NOCOUNT ON; GO ALTER PROC usp_test AS BEGIN IF object_id('tempdb..#temp') IS NOT NULL …

2
ค้นหาขนาดที่ไม่บีบอัดของตารางทั้งหมดในฐานข้อมูล
ใน Dynamics AX มีกลไกการแคชซึ่งสามารถกำหนดตารางให้โหลดลงในหน่วยความจำและแคชได้ แคชนี้ จำกัด จำนวน KB ไว้เพื่อป้องกันปัญหาหน่วยความจำ การตั้งค่าที่ฉันกำลังพูดถึงถูกเรียกentiretablecacheและโหลดทั้งตารางในหน่วยความจำทันทีที่มีการร้องขอบันทึกเดียว จนถึงเมื่อเร็ว ๆ นี้เราใช้สคริปต์บางตัวเพื่อตรวจสอบขนาดของตารางที่มีการตั้งค่านี้เพื่อดูว่าขนาดตารางเกินขีด จำกัด นี้หรือไม่ อย่างไรก็ตามตอนนี้การบีบอัดเริ่มเข้ามาเล่นและสิ่งต่าง ๆ เช่นsp_spaceusedหรือsys.allocation_unitsดูเหมือนจะรายงานพื้นที่ที่ใช้จริงโดยข้อมูลที่บีบอัด เห็นได้ชัดว่าแอ็พพลิเคชันเซิร์ฟเวอร์ทำงานกับข้อมูลที่ไม่มีการบีบอัดดังนั้นขนาดข้อมูลบนดิสก์ใน SQL Server นั้นไม่เกี่ยวข้อง ฉันต้องการขนาดจริงข้อมูลที่ไม่มีการบีบอัดจะมี ฉันรู้เกี่ยวกับsp_estimate_data_compression_savingsแต่อย่างที่ชื่อบอกนี่เป็นเพียงการประมาณ ฉันต้องการมีขนาดที่ถูกต้องที่สุด วิธีเดียวที่ฉันคิดได้ก็คือ SQL แบบไดนามิกที่ซับซ้อนที่สร้างตารางที่ไม่มีการบีบอัดด้วยโครงสร้างเดียวกับตารางที่ถูกบีบอัดแทรกข้อมูลที่บีบอัดในตารางเงานั้นแล้วตรวจสอบขนาดของตารางเงานั้น จำเป็นต้องพูดว่านี่เป็นบิตที่น่าเบื่อและใช้เวลาสักครู่ในการรันบนฐานข้อมูลหลายร้อย GB Powershell อาจเป็นตัวเลือก แต่ฉันไม่ต้องการวนซ้ำทุกตารางเพื่อดำเนินการselect *กับพวกเขาเพื่อตรวจสอบขนาดในสคริปต์เนื่องจากอาจทำให้แคชล้นและอาจใช้เวลานานเกินไป กล่าวโดยย่อฉันต้องการวิธีเพิ่มขนาดสำหรับแต่ละตารางเนื่องจากจะไม่มีการบีบอัดและมีการแตกแฟรกเมนต์ออกมาจากสมการที่นำเสนอไปยังแอปพลิเคชันหากเป็นไปได้ ฉันเปิดกว้างกับแนวทางที่แตกต่างกัน T-SQL เป็นที่ต้องการมากกว่า แต่ฉันไม่ได้ต่อต้าน Powershell หรือวิธีการสร้างสรรค์อื่น ๆ สมมติว่าบัฟเฟอร์ในแอปพลิเคชันคือขนาดของข้อมูล bigint มักมีขนาดเท่ากับ bigint เสมอและประเภทข้อมูลอักขระคือ 2 ไบต์ต่ออักขระ (unicode) …

2
"ตารางการเปลี่ยนแปลง" ใน Postgres คืออะไร
หน้าอธิบายว่ามีอะไรใหม่ใน Postgres 10กล่าวถึง "ตารางการเปลี่ยนผ่านสำหรับทริกเกอร์" ตารางการเปลี่ยนแปลงสำหรับทริกเกอร์ คุณลักษณะนี้ทำให้AFTER STATEMENTทั้งสองเป็นประโยชน์และมีประสิทธิภาพโดยการเปิดเผยแถวที่เก่าและใหม่ในแบบสอบถาม ก่อนที่คุณสมบัตินี้AFTER STATEMENTทริกเกอร์จะไม่สามารถเข้าถึงสิ่งเหล่านี้ได้โดยตรงและการแก้ไขปัญหาคือไบแซนไทน์และมีประสิทธิภาพต่ำ สามารถเขียนลอจิกลอจิกจำนวนมากได้AFTER STATEMENTโดยหลีกเลี่ยงความจำเป็นในการสลับบริบทที่มีราคาแพงในแต่ละแถวที่จำเป็นสำหรับทริกเกอร์แต่ละแถว ตารางการเปลี่ยนแปลงคืออะไร?

3
บันทึก SQL Server บันทึกการดำเนินการที่ไม่ธรรมดาหรือไม่?
ฉันมักจะเห็นคำสั่งเช่นบันทึกเซิร์ฟเวอร์ sql บันทึกทุกการกระทำและการเลือกใช้ แต่ผมกำลังสับสนเกี่ยวกับสิ่งที่เกิดขึ้นเมื่อมีการทำธุรกรรมในที่สุดก็กลิ้ง กลับ บอกว่าการทำธุรกรรมอย่างชัดเจนมี 3 งบ: statement A, statement B, และในที่สุดstatement Crollback statement D ตอนนี้พูดเมื่อการดำเนินการไม่ถึงrollback statement Dการแก้ไขจะเกิดจากการstatements A through Cบันทึกลงในบันทึกของเซิร์ฟเวอร์ sql หรือไม่ ความเข้าใจที่ 1 : งบ A ถึง D ทั้งหมดได้รับการบันทึก SQL Server บันทึกทุกอย่างไม่ว่าอะไรก็ตาม การทำความเข้าใจที่ 2 : การปรับเปลี่ยนจะถูกเก็บไว้ที่ใดที่หนึ่งในหน่วยความจำเท่านั้นและบันทึกไว้เพื่อบันทึกเมื่อ SQL Server เห็นcommitคำสั่ง ถ้าปรากฎว่าเป็นrollbackคำสั่ง SQL Server ก็เพิกเฉยต่อการแปลงข้อมูลไม่มีการเขียนเพื่อบันทึกเกิดขึ้นเพราะไม่มีวัตถุประสงค์ กล่าวอีกนัยหนึ่ง SQL Server บันทึกเมื่อมีผลลัพธ์สุทธิก่อนและหลังธุรกรรม …
12 sql-server 

3
ทำไมตัวดำเนินการแบบขนาน (Repartition Streams) จะลดการประมาณแถวเป็น 1
ฉันใช้ SQL Server 2012 Enterprise ฉันเจอแผน SQL ที่แสดงพฤติกรรมบางอย่างที่ฉันไม่พบว่าใช้งานง่าย หลังจากการดำเนินการสแกนดัชนีแบบขนานขนาดใหญ่การดำเนินการแบบขนาน (Repartition Streams) เกิดขึ้น แต่กำลังฆ่าการประมาณแถวที่ถูกส่งคืนโดยดัชนีการสแกน (Object10.Index2) ลดการประมาณการเป็น 1 ฉันได้ทำการค้นหาบางอย่างแล้ว แต่ ยังไม่เจออะไรที่อธิบายพฤติกรรมนี้ แบบสอบถามค่อนข้างง่ายแม้ว่าแต่ละตารางจะมีระเบียนเป็นล้าน ๆ นี่เป็นส่วนหนึ่งของกระบวนการโหลด DWH และชุดข้อมูลระดับกลางนี้มีการแตะสองสามครั้งตลอด แต่คำถามที่ฉันมีเกี่ยวข้องกับการประมาณแถวโดยเฉพาะ บางคนสามารถอธิบายได้หรือไม่ว่าเหตุใดการประมาณแถวที่ถูกต้องจึงไปที่ 1 ในตัวดำเนินการขนาน (Repartition Strems) นอกจากนี้ ฉันได้ส่งแผนเต็มรูปแบบเพื่อวางแผน นี่คือการดำเนินการที่เป็นปัญหา: รวมแผนผังต้นไม้ในกรณีที่เพิ่มบริบทเพิ่มเติม: ฉันสามารถใช้รูปแบบบางอย่างของรายการเชื่อมต่อที่ยื่นโดย Paul White ได้หรือไม่ (อธิบายเพิ่มเติมในเชิงลึกบนบล็อกของเขาที่นี่ ) อย่างน้อยมันก็เป็นสิ่งเดียวที่ฉันพบว่าดูเหมือนจะอยู่ใกล้กับสิ่งที่ฉันกำลังวิ่งเข้าไปในระยะไกลถึงแม้ว่าจะไม่มีโอเปอร์เรเตอร์ที่เล่น

5
การเติมข้อมูลที่หายไปตามค่าสิ้นเดือนก่อนหน้า
รับข้อมูลต่อไปนี้: create table #histories ( username varchar(10), account varchar(10), assigned date ); insert into #histories values ('PHIL','ACCOUNT1','2017-01-04'), ('PETER','ACCOUNT1','2017-01-15'), ('DAVE','ACCOUNT1','2017-03-04'), ('ANDY','ACCOUNT1','2017-05-06'), ('DAVE','ACCOUNT1','2017-05-07'), ('FRED','ACCOUNT1','2017-05-08'), ('JAMES','ACCOUNT1','2017-08-05'), ('DAVE','ACCOUNT2','2017-01-02'), ('PHIL','ACCOUNT2','2017-01-18'), ('JOSH','ACCOUNT2','2017-04-08'), ('JAMES','ACCOUNT2','2017-04-09'), ('DAVE','ACCOUNT2','2017-05-06'), ('PHIL','ACCOUNT2','2017-05-07') ; ... ซึ่งแสดงถึงเมื่อผู้ใช้ที่ได้รับมอบหมายให้กับบัญชี ฉันกำลังมองหาผู้ที่เป็นเจ้าของบัญชีที่กำหนดในวันสุดท้ายของแต่ละเดือน (วันที่ได้รับมอบหมายคือวันที่บัญชีโอนการเป็นเจ้าของ) โดยมีการสิ้นเดือนที่ขาดหายไป (อาจสร้างจากdatesตารางที่มีประโยชน์ที่ฉันมีอยู่) มีคอลัมน์ที่มีประโยชน์DateKey, DateและLastDayOfMonth[มารยาทของ @AaronBertrand]) 1 ผลลัพธ์ที่ต้องการคือ: PETER, ACCOUNT1, 2017-01-31 PETER, ACCOUNT1, 2017-02-28 DAVE, ACCOUNT1, 2017-03-31 …

3
แบบสอบถาม JOIN ที่เรียบง่ายช้ามาก
โครงสร้าง DB แบบง่าย (สำหรับฟอรัมออนไลน์): CREATE TABLE users ( id integer NOT NULL PRIMARY KEY, username text ); CREATE INDEX ON users (username); CREATE TABLE posts ( id integer NOT NULL PRIMARY KEY, thread_id integer NOT NULL REFERENCES threads (id), user_id integer NOT NULL REFERENCES users (id), date timestamp without time …

2
ไม่มีแผนการดำเนินการสำหรับกระบวนงานที่เก็บไว้
อะไรคือสาเหตุของแผนที่จะหายไปจากแคชสำหรับขั้นตอนการจัดเก็บ? WITH RECOMPILE SQL แบบไดนามิก รหัสที่เข้ารหัส การเปลี่ยนแปลงข้อมูลที่สำคัญ อัปเดตสถิติ มีอะไรอีกบ้าง? ฉันทำงานกับเซิร์ฟเวอร์ 2 เครื่อง (SQL Server 2008 R2 และ SQL Server 2012) เมื่อเร็ว ๆ นี้ที่ไม่มีแผนในแคชสำหรับขั้นตอนการจัดเก็บที่ใช้ทรัพยากรมาก คำสั่งจำนวนมากอาจทั้งหมดในกระบวนการที่เก็บไว้ยังไม่มีแผนในแคช โพรซีเดอร์ที่เก็บไว้บางตัวรันค่อนข้างบ่อยเหมือนสองสามครั้งต่อวินาที ไม่มีแรงกดดันด้านความจำ แต่อย่างใด เซิร์ฟเวอร์ตัวใดตัวหนึ่งมีฮาร์ดแวร์มากกว่าที่ต้องการ ฉันคิดว่าแผนที่ขาดหายไปเกิดจากการสร้างตารางชั่วคราวในระหว่างขั้นตอนการจัดเก็บ แต่ดูเหมือนจะเป็นข้อมูลเก่าจาก SQL Server 2000 หรือเก่ากว่า เริ่มต้นด้วย SQL Server 2005 การคอมไพล์ใหม่เกิดขึ้นที่ระดับคำสั่งสำหรับคำสั่งหลังจาก DDL เป็นจริงในทุกกรณีหรือยังสามารถเกิดขึ้นกับรุ่นที่ใหม่กว่าได้หรือไม่ มีอะไรอีกที่เป็นตัวการสำคัญสำหรับแผนการที่หายไป? ฉันได้อ่านบทความบางส่วนในหัวข้อนี้ แต่ดูเหมือนว่าไม่มีอะไรเหมาะสม ปรับให้เหมาะสมสำหรับเวิร์กโหลด adhocเปิดใช้งานบนเซิร์ฟเวอร์ที่ฉันกำลังดูในสัปดาห์นี้ หนึ่งในกระบวนงานที่เก็บไว้จะดำเนินการวันละครั้งเท่านั้น ฉันมีรหัสสำหรับอันนั้น ฉันไม่มีรหัสสำหรับรหัสที่ทำงานมากกว่า 100 …

2
[FROM x, y] หมายถึงอะไรใน Postgres
ฉันเพิ่งเริ่มต้นกับ Postgres อ่านเอกสารนี้ฉันเจอแบบสอบถามนี้: SELECT title, ts_rank_cd(textsearch, query) AS rank FROM apod, to_tsquery('neutrino|(dark & matter)') query WHERE query @@ textsearch ORDER BY rank DESC LIMIT 10; ฉันสามารถเข้าใจทุกอย่างในแบบสอบถามนี้ยกเว้นFROM apod, ...สำหรับการนี้: สิ่งนี้,หมายความว่าอย่างไร ฉันเคยเข้าร่วม แต่ไม่ได้มีหลายFROMงบคั่นด้วยเครื่องหมายจุลภาค ฉันค้นหาสุทธิโดยไม่มีประโยชน์ หลังจากดูและคิดแล้วฉันคิดว่ามันประกาศตัวแปรที่เรียกว่าแบบสอบถามเพื่อให้สามารถใช้งานได้หลายครั้ง แต่ถ้านี่เป็นเรื่องจริงมันเกี่ยวข้องกับFROMอะไร?
12 postgresql  join 

2
ฉันสามารถ refactor แบบสอบถามนี้เพื่อให้ทำงานในแบบคู่ขนานได้หรือไม่
ฉันมีแบบสอบถามที่ใช้เวลาประมาณ 3 ชั่วโมงในการทำงานบนเซิร์ฟเวอร์ของเรา - และมันไม่ได้ใช้ประโยชน์จากการประมวลผลแบบขนาน (ประมาณ 1.15 ล้านระเบียนในdbo.Deidentified300 ระเบียนในdbo.NamesMultiWord) เซิร์ฟเวอร์มีการเข้าถึง 8 คอร์ UPDATE dbo.Deidentified WITH (TABLOCK) SET IndexedXml = dbo.ReplaceMultiWord(IndexedXml), DE461 = dbo.ReplaceMultiWord(DE461), DE87 = dbo.ReplaceMultiWord(DE87), DE15 = dbo.ReplaceMultiWord(DE15) WHERE InProcess = 1; และReplaceMultiwordเป็นกระบวนการที่กำหนดเป็น: SELECT @body = REPLACE(@body,Names,Replacement) FROM dbo.NamesMultiWord ORDER BY [WordLength] DESC RETURN @body --NVARCHAR(MAX) การเรียกร้องให้ReplaceMultiwordป้องกันการก่อตัวเป็นแผนขนานหรือไม่ มีวิธีที่จะเขียนสิ่งนี้เพื่อให้มีความเท่าเทียมกันหรือไม่? ReplaceMultiword …

2
กำหนดค่าการมอบหมายที่ไม่ จำกัด สำหรับ BULK INSERT
ฉันมีโหนด Microsoft SQL Server 2016 คู่หนึ่งในกลุ่ม Always On Availability ฉันกำลังพยายามดำเนินการBULK INSERT(โดยใช้แบบสอบถาม SQL Server 2016 Management Studio) ในไฟล์ที่อยู่ในคลัสเตอร์เซิร์ฟเวอร์ล้มเหลวของ Windows Server 2016 แต่ฉันได้รับข้อผิดพลาดต่อไปนี้: เกี่ยวกับข่าวสาร 4861 ระดับ 16 สถานะ 1 ไม่สามารถโหลดจำนวนมากได้เนื่องจากไม่สามารถเปิดไฟล์ "\ nas2.my.domain \ Microsoft SQL Server 2016 Enterprise \ test.txt" รหัสข้อผิดพลาดของระบบปฏิบัติการ 5 (ปฏิเสธการเข้าถึง) สิ่งนี้จะเกิดขึ้นโดยไม่คำนึงว่าฉันใช้ชื่อโหนดที่ใช้งาน ( nas2.my.domain) หรือฟังคลัสเตอร์ล้มเหลว ( nas.my.domain) หรือไม่ หลังจากมองไปรอบ ๆ …

1
ฉันจะบังคับให้ประเมินค่าสเกลาร์ UDF เพียงครั้งเดียวในแบบสอบถามได้อย่างไร
ฉันมีข้อความค้นหาที่ต้องการกรองผลลัพธ์ของสเกลาร์ UDF ต้องส่งเคียวรีเป็นคำสั่งเดียว (ดังนั้นฉันไม่สามารถกำหนดผลลัพธ์ UDF ให้กับตัวแปรโลคอล) และฉันไม่สามารถใช้ TVF ได้ ฉันรับรู้ถึงปัญหาประสิทธิภาพที่เกิดจาก UDF แบบเกลาซึ่งรวมถึงการบังคับให้แผนทั้งหมดทำงานอย่างต่อเนื่องหน่วยความจำที่มากเกินไปปัญหาการประมาณค่าทาง cardinality และการขาด inlining สำหรับคำถามนี้โปรดสมมติว่าฉันต้องใช้สเกลาร์ UDF UDF นั้นค่อนข้างแพงในการโทร แต่ในทางทฤษฎีแล้วแบบสอบถามสามารถนำไปใช้อย่างมีเหตุผลโดยเครื่องมือเพิ่มประสิทธิภาพในลักษณะที่ฟังก์ชันจะต้องคำนวณเพียงครั้งเดียว ฉันล้อเลียนตัวอย่างที่ง่ายมากสำหรับคำถามนี้ แบบสอบถามต่อไปนี้ใช้เวลา 6152 ms ในการดำเนินการบนเครื่องของฉัน: SELECT x1.ID FROM dbo.X_100_INTEGERS x1 WHERE x1.ID >= dbo.EXPENSIVE_UDF(); ตัวดำเนินการตัวกรองในแผนแบบสอบถามชี้ให้เห็นว่าฟังก์ชันนั้นถูกประเมินหนึ่งครั้งสำหรับแต่ละแถว: DDL และการเตรียมข้อมูล: CREATE OR ALTER FUNCTION dbo.EXPENSIVE_UDF () RETURNS INT AS BEGIN DECLARE @tbl TABLE …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.