سؤال

أنا أعمل مع 2 جداول ذات صلة في بيئة Microsoft SQL Server 2008 متصلة عبر GUID. في طاولة واحدة، يكون للحقل النوع varchar(50), ، والآخر هو أنواع بشكل صحيح كما uniqueidentifier. وبعد من الواضح أن هذا سيء ولكن لا يمكنني تغيير هذا الآن لأنه يعطى بواسطة قطعة إرث من البرامج.

يحتاج تحويل SQL Server إلى الأداء في كل انضمام داخلي يجعل الاستعلامات تعمل بطيئة بشكل رهيب، حيث لا يمكنني استخدام المؤشرات على الإطلاق. حاولت إضافة عمود محسوب، الذي يستمر، للحصول على معرف المخزن ك uniqueidentifer. وبعد وبهذه الطريقة يمكنني إضافة فهرس للحصول عليها بشكل أسرع بكثير. فشلت.

هل يعرف أي شخص ما إذا كان بإمكاني تخزين قيمة تحويلها صراحة في عمود الكمبيوتر. إذا استطعت، فما هي الصيغة لاستخدامها هنا؟

هتافات، ماتياس

هل كانت مفيدة؟

المحلول

هذا عملت بالنسبة لي:

CREATE TABLE t_uuid (charid VARCHAR(50) NOT NULL, uuid AS CAST(charid AS UNIQUEIDENTIFIER))

CREATE INDEX IX_uuid_uuid ON t_uuid (uuid)

INSERT
INTO    t_uuid (charid)
VALUES  (NEWID())

SELECT  *
FROM    t_uuid

نصائح أخرى

تحويل (Uniqueidentifier، your_varchar_here)

اعتمادا على عدد المرات التي تحتاجها إلى جعل التحويل للانضمام، سأستمر CTE. لتحويل نوع البيانات (أنواع) البيانات. يتم بناؤه بشكل أسرع من عرض مضمون (أفضل خيار مؤقت آخر). في كلتا الحالتين، كنت تعرض قيمة كوعي بيانات صحيح في عمود نتيجة من عرض CTE / Inline حتى تتمكن من الانضمام إليه. مثال CTE:

WITH example AS (
   SELECT t.guid
          CONVERT(UniqueIdentifier, t.guid) 'cguid'
     FROM TABLE t)
SELECT t.*
  FROM TABLE t
  JOIN example e ON e.cguid = t.guid

مثال عرض مضمن:

SELECT t.*
  FROM TABLE t
  JOIN (SELECT t.guid
               CONVERT(UniqueIdentifier, t.guid) 'cguid'
          FROM TABLE t) e ON e.cguid = t.guid

لن يتم استخدام فهرس GUID (على افتراض واحد يفعله)، لكنه ليس عادة جيدة لأداء تحويل نوع البيانات في جملة WHERE.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top