December 2, 2009 at 8:09 am
I have a table where one columns itβs a data type xml, Iβm trying to create a function where I do insert values into my var table. These values come from the xml column and it will insert into the different columns in the var table. This process takes forever to return few rows. If I do the select without the insertion part, the result is pretty fast. Or if I do the insert without the xml column the insertion is fast. Seems like I have something wrong with my xml column.
Can you advice please?
Iβm testing this in my Query Analyzer (SQL 2005)
declare @versionsxml xml
select @versionsxml = versionsxml from versionbatchlog where id = 11
declare @raw table
(
rowid int,
versionidentity int,
alias varchar(50),
packid int,
versionid int,
attr xml
)
insert into @raw
( rowid ,versionidentity , alias , packid , versionid, attr )
select
v.item.value('@rowid','int') rowid,
v.item.value('@versionidentity', 'int') versionidentity,
v.item.value('@alias','varchar(50)') alias,
v.item.value('@packid','int') packid,
v.item.value('@versionid','int') versionid,
v.item.query('./attribute') attr
from @versionsxml.nodes('xml/version') as v(item)
December 3, 2009 at 7:53 am
no one ??
December 3, 2009 at 12:07 pm
Maybe it's the table variable. Can you eliminate it with something along these lines?
declare @versionbatchlog table (id int, versionsxml xml)
insert @versionbatchlog
select 11, '<xml><version rowid="1" alias="hello world" />
<version rowid="2" packid="17" />
<version rowid="5" alias="another alias" packid="17" />
<version rowid="6" alias="yet another alias" /></xml>'
SELECT
v.item.value('@rowid','int') rowid,
v.item.value('@versionidentity', 'int') versionidentity,
v.item.value('@alias','varchar(50)') alias,
v.item.value('@packid','int') packid,
v.item.value('@versionid','int') versionid,
v.item.query('./attribute') attr
FROM (select versionsxml from @versionbatchlog where id = 11) AS P
CROSS APPLY versionsxml.nodes('xml/version') v(item)
I guess it would depend on what you want to do with this data. Can you elaborate?
Ryan Randall
Solutions are easy. Understanding the problem, now, that's the hard part.
December 3, 2009 at 1:11 pm
MTY-1082557 (12/3/2009)
no one ??
Give us some sample data that demonstrates the problem.
[font="Times New Roman"]-- RBarryYoung[/font], [font="Times New Roman"] (302)375-0451[/font] blog: MovingSQL.com, Twitter: @RBarryYoung[font="Arial Black"]
Proactive Performance Solutions, Inc. [/font][font="Verdana"] "Performance is our middle name."[/font]
December 3, 2009 at 1:18 pm
this is the xml ( I just sending you part of that because its huge)
<xml> <version alias="m4l_HSI_006$1" versionidentity="" packid="" versionid="" rowid="1"> <attribute key="t_weight" keyDesc="Weight" value="0" valDesc="" /><attribute key="t_rid" keyDesc="" value="907" valDesc="" /><attribute key="t_ridver" keyDesc="" value="1" valDesc="" /><attribute key="t_zid" keyDesc="" value="ET_Albuquerque_SantaFe" valDesc="" /><attribute key="t_cid" keyDesc="" value="KASA" valDesc="" /><attribute key="a_flight_end" keyDesc="Flight End" value="N/A" valDesc="" /></version></xml>
this is what i get in my select without insert the data. The problem is when it try to insert the data into the var table or temp table. Seems like the ./attribute column is the problem and dont find the solution
rowid versionidentity alias packid versionid attr
1 0 m4l_HSI_006$1 0 0 <attribute key="t_weight" keyDesc="Weight" value="0" valDesc="" /><attribute key="t_rid" keyDesc="" value="907" valDesc="" /><attribute key="t_ridver" keyDesc="" value="1" valDesc="" /><attribute key="t_zid" keyDesc="" value="ET_Albuquerque_SantaFe" valDesc="" /><attribute key="t_cid" keyDesc="" value="KASA" valDesc="" /><attribute key="a_flight_end" keyDesc="Flight End" value="N/A" valDesc="" /><attribute key="a_flight_start" keyDesc="Flight Start" value="N/A" valDesc="" /><attribute key="a_isci_description" keyDesc="Isci Description" value="More for Less HSI" valDesc="" /><attribute key="l_user_description" keyDesc="User Description" value="na6.10_1" valDesc="" /><attribute key="l_vwcampaigngroup" keyDesc="Campaign Group" value="CST" valDesc="" /><attribute key="l_vwisciformat" keyDesc="Isci Format" value="CST" valDesc="" /><attribute key="l_VwDeliveryType" keyDesc="Delivery Type" value="1" valDesc="" /><attribute key="a_db_date" keyDesc="" value="06/24/09." valDesc="" /><attribute key="l_phone" keyDesc="" value="Predefined" valDesc="" /><attribute key="l_Price" keyDesc="" value="Predefined" valDesc="" /><attribute key="s_000_Service" keyDesc="Internet Service" value="D3" valDesc="" /><attribute key="s_01_competitor" keyDesc="Select Competitor" value="04_ATTUverse" valDesc="AT&T U-verse" /><attribute key="s_03_price_offer" keyDesc="Select Price" value="01" valDesc="$8.99/mo. " /><attribute key="s_04_term_offer" keyDesc="Select # of Months" value="1" valDesc="for 3 mos." /><attribute key="s_05_phone" keyDesc="Select Phone" value="phone_1" valDesc="1.800.COMCAST" /><attribute key="s_05A_tier" keyDesc="Select Product Tier" value="01_Performance" valDesc="Performance" /><attribute key="s_06_CT_market" keyDesc="Connecticut Market:" value="no" valDesc="No" /><attribute key="s_Media_Table" keyDesc="Dynamic Media Table" value="Yes" valDesc="" />
2 0 m4l_HSI_006$1 0 0 <attribute key="t_weight" keyDesc="Weight" value="0" valDesc="" /><attribute key="t_rid" keyDesc="" value="907" valDesc="" /><attribute key="t_ridver" keyDesc="" value="1" valDesc="" /><attribute key="t_zid" keyDesc="" value="ET_Albuquerque_SantaFe" valDesc="" /><attribute key="t_cid" keyDesc="" value="KASY" valDesc="" /><attribute key="a_flight_end" keyDesc="Flight End" value="N/A" valDesc="" /><attribute key="a_flight_start" keyDesc="Flight Start" value="N/A" valDesc="" /><attribute key="a_isci_description" keyDesc="Isci Description" value="More for Less HSI" valDesc="" /><attribute key="l_user_description" keyDesc="User Description" value="na6.10_1" valDesc="" /><attribute key="l_vwcampaigngroup" keyDesc="Campaign Group" value="CST" valDesc="" /><attribute key="l_vwisciformat" keyDesc="Isci Format" value="CST" valDesc="" /><attribute key="l_VwDeliveryType" keyDesc="Delivery Type" value="1" valDesc="" /><attribute key="a_db_date" keyDesc="" value="06/24/09." valDesc="" /><attribute key="l_phone" keyDesc="" value="Predefined" valDesc="" /><attribute key="l_Price" keyDesc="" value="Predefined" valDesc="" /><attribute key="s_000_Service" keyDesc="Internet Service" value="D3" valDesc="" /><attribute key="s_01_competitor" keyDesc="Select Competitor" value="04_ATTUverse" valDesc="AT&T U-verse" /><attribute key="s_03_price_offer" keyDesc="Select Price" value="01" valDesc="$8.99/mo. " /><attribute key="s_04_term_offer" keyDesc="Select # of Months" value="1" valDesc="for 3 mos." /><attribute key="s_05_phone" keyDesc="Select Phone" value="phone_1" valDesc="1.800.COMCAST" /><attribute key="s_05A_tier" keyDesc="Select Product Tier" value="01_Performance" valDesc="Performance" /><attribute key="s_06_CT_market" keyDesc="Connecticut Market:" value="no" valDesc="No" /><attribute key="s_Media_Table" keyDesc="Dynamic Media Table" value="Yes" valDesc="" />
3 0 m4l_HSI_006$1 0 0 <attribute key="t_weight" keyDesc="Weight" value="0" valDesc="" /><attribute key="t_rid" keyDesc="" value="907" valDesc="" /><attribute key="t_ridver" keyDesc="" value="1" valDesc="" /><attribute key="t_zid" keyDesc="" value="ET_Albuquerque_SantaFe" valDesc="" /><attribute key="t_cid" keyDesc="" value="KAZQ" valDesc="" /><attribute key="a_flight_end" keyDesc="Flight End" value="N/A" valDesc="" /><attribute key="a_flight_start" keyDesc="Flight Start" value="N/A" valDesc="" /><attribute key="a_isci_description" keyDesc="Isci Description" value="More for Less HSI" valDesc="" /><attribute key="l_user_description" keyDesc="User Description" value="na6.10_1" valDesc="" /><attribute key="l_vwcampaigngroup" keyDesc="Campaign Group" value="CST" valDesc="" /><attribute key="l_vwisciformat" keyDesc="Isci Format" value="CST" valDesc="" /><attribute key="l_VwDeliveryType" keyDesc="Delivery Type" value="1" valDesc="" /><attribute key="a_db_date" keyDesc="" value="06/24/09." valDesc="" /><attribute key="l_phone" keyDesc="" value="Predefined" valDesc="" /><attribute key="l_Price" keyDesc="" value="Predefined" valDesc="" /><attribute key="s_000_Service" keyDesc="Internet Service" value="D3" valDesc="" /><attribute key="s_01_competitor" keyDesc="Select Competitor" value="04_ATTUverse" valDesc="AT&T U-verse" /><attribute key="s_03_price_offer" keyDesc="Select Price" value="01" valDesc="$8.99/mo. " /><attribute key="s_04_term_offer" keyDesc="Select # of Months" value="1" valDesc="for 3 mos." /><attribute key="s_05_phone" keyDesc="Select Phone" value="phone_1" valDesc="1.800.COMCAST" /><attribute key="s_05A_tier" keyDesc="Select Product Tier" value="01_Performance" valDesc="Performance" /><attribute key="s_06_CT_market" keyDesc="Connecticut Market:" value="no" valDesc="No" /><attribute key="s_Media_Table" keyDesc="Dynamic Media Table" value="Yes" valDesc="" />
December 3, 2009 at 1:34 pm
MTY-1082557 (12/3/2009)
this is the xml ( I just sending you part of that because its huge)
<xml> <version alias="m4l_HSI_006$1" versionidentity="" packid="" versionid="" rowid="1"> <attribute key="t_weight" keyDesc="Weight" value="0" valDesc="" /><attribute key="t_rid" keyDesc="" value="907" valDesc="" /><attribute key="t_ridver" keyDesc="" value="1" valDesc="" /><attribute key="t_zid" keyDesc="" value="ET_Albuquerque_SantaFe" valDesc="" /><attribute key="t_cid" keyDesc="" value="KASA" valDesc="" /><attribute key="a_flight_end" keyDesc="Flight End" value="N/A" valDesc="" /></version></xml>
Do you still see the problem when you use this smaller version?
[font="Times New Roman"]-- RBarryYoung[/font], [font="Times New Roman"] (302)375-0451[/font] blog: MovingSQL.com, Twitter: @RBarryYoung[font="Arial Black"]
Proactive Performance Solutions, Inc. [/font][font="Verdana"] "Performance is our middle name."[/font]
December 3, 2009 at 1:38 pm
no because its only one record. I dont understand why it takes long to insert it because when I do only the select, it shows the 400 records in less than a second. But when I insert it it takes forever.
any clue ?
December 3, 2009 at 1:45 pm
Can you supply us with a script or the data the can duplicate the problem? Just attach it to your reply as a TXT or ZIP file if it is too large.
[font="Times New Roman"]-- RBarryYoung[/font], [font="Times New Roman"] (302)375-0451[/font] blog: MovingSQL.com, Twitter: @RBarryYoung[font="Arial Black"]
Proactive Performance Solutions, Inc. [/font][font="Verdana"] "Performance is our middle name."[/font]
December 3, 2009 at 1:49 pm
attached.
Thank you
December 3, 2009 at 3:13 pm
I tried to run your query but stopped it after 3 minutes or so.
So, yes, I can confirm that it takes forever...
Then I just tried the sample code Ryan Randall suggested and it finished in less tan half a second (as per statistics time).
Here's what I did:
insert into @raw
( rowid ,versionidentity , alias , packid , versionid, attr )
SELECT
v.item.value('@rowid','int') rowid,
v.item.value('@versionidentity', 'int') versionidentity,
v.item.value('@alias','varchar(50)') alias,
v.item.value('@packid','int') packid,
v.item.value('@versionid','int') versionid,
v.item.query('./attribute') attr
FROM (select versionsxml from @versionbatchlog where id = 11) AS P
CROSS APPLY versionsxml.nodes('xml/version') v(item)
/* partial result set:
rowid versionidentity alias packid versionid attr
33 0 m4l_HSI_006$1 0 0 <attribute key="t_weight" keyDesc="Weight" value="0" valDesc="" /><attribute key="t_rid" keyDesc="" value="907" valDesc="" /><attribute key="t_ridver" keyDesc="" value="1" valDesc="" /><attribute key="t_zid" keyDesc="" value="ET_Atlanta" valDesc="" /><attribute key="t_cid" keyDesc="" value="WGCL" valDesc="" /><attribute key="a_flight_end" keyDesc="Flight End" value="N/A" valDesc="" /><attribute key="a_flight_start" keyDesc="Flight Start" value="N/A" valDesc="" /><attribute key="a_isci_description" keyDesc="Isci Description" value="More for Less HSI" valDesc="" /><attribute key="l_user_description" keyDesc="User Description" value="na6.10_1" valDesc="" /><attribute key="l_vwcampaigngroup" keyDesc="Campaign Group" value="CST" valDesc="" /><attribute key="l_vwisciformat" keyDesc="Isci Format" value="CST" valDesc="" /><attribute key="l_VwDeliveryType" keyDesc="Delivery Type" value="1" valDesc="" /><attribute key="a_db_date" keyDesc="" value="06/24/09." valDesc="" /><attribute key="l_phone" keyDesc="" value="Predefined" valDesc="" /><attribute key="l_Price" keyDesc="" value="Predefined" valDesc="" /><attribute key="s_000_Service" keyDesc="Internet Service" value="D3" valDesc="" /><attribute key="s_01_competitor" keyDesc="Select Competitor" value="04_ATTUverse" valDesc="AT&T U-verse" /><attribute key="s_03_price_offer" keyDesc="Select Price" value="01" valDesc="$8.99/mo. " /><attribute key="s_04_term_offer" keyDesc="Select # of Months" value="1" valDesc="for 3 mos." /><attribute key="s_05_phone" keyDesc="Select Phone" value="phone_1" valDesc="1.800.COMCAST" /><attribute key="s_05A_tier" keyDesc="Select Product Tier" value="01_Performance" valDesc="Performance" /><attribute key="s_06_CT_market" keyDesc="Connecticut Market:" value="no" valDesc="No" /><attribute key="s_Media_Table" keyDesc="Dynamic Media Table" value="Yes" valDesc="" />
34 0 m4l_HSI_006$1 0 0 <attribute key="t_weight" keyDesc="Weight" value="0" valDesc="" /><attribute key="t_rid" keyDesc="" value="907" valDesc="" /><attribute key="t_ridver" keyDesc="" value="1" valDesc="" /><attribute key="t_zid" keyDesc="" value="ET_Atlanta" valDesc="" /><attribute key="t_cid" keyDesc="" value="WGTV" valDesc="" /><attribute key="a_flight_end" keyDesc="Flight End" value="N/A" valDesc="" /><attribute key="a_flight_start" keyDesc="Flight Start" value="N/A" valDesc="" /><attribute key="a_isci_description" keyDesc="Isci Description" value="More for Less HSI" valDesc="" /><attribute key="l_user_description" keyDesc="User Description" value="na6.10_1" valDesc="" /><attribute key="l_vwcampaigngroup" keyDesc="Campaign Group" value="CST" valDesc="" /><attribute key="l_vwisciformat" keyDesc="Isci Format" value="CST" valDesc="" /><attribute key="l_VwDeliveryType" keyDesc="Delivery Type" value="1" valDesc="" /><attribute key="a_db_date" keyDesc="" value="06/24/09." valDesc="" /><attribute key="l_phone" keyDesc="" value="Predefined" valDesc="" /><attribute key="l_Price" keyDesc="" value="Predefined" valDesc="" /><attribute key="s_000_Service" keyDesc="Internet Service" value="D3" valDesc="" /><attribute key="s_01_competitor" keyDesc="Select Competitor" value="04_ATTUverse" valDesc="AT&T U-verse" /><attribute key="s_03_price_offer" keyDesc="Select Price" value="01" valDesc="$8.99/mo. " /><attribute key="s_04_term_offer" keyDesc="Select # of Months" value="1" valDesc="for 3 mos." /><attribute key="s_05_phone" keyDesc="Select Phone" value="phone_1" valDesc="1.800.COMCAST" /><attribute key="s_05A_tier" keyDesc="Select Product Tier" value="01_Performance" valDesc="Performance" /><attribute key="s_06_CT_market" keyDesc="Connecticut Market:" value="no" valDesc="No" /><attribute key="s_Media_Table" keyDesc="Dynamic Media Table" value="Yes" valDesc="" />
35 0 m4l_HSI_006$1 0 0 <attribute key="t_weight" keyDesc="Weight" value="0" valDesc="" /><attribute key="t_rid" keyDesc="" value="907" valDesc="" /><attribute key="t_ridver" keyDesc="" value="1" valDesc="" /><attribute key="t_zid" keyDesc="" value="ET_Atlanta" valDesc="" /><attribute key="t_cid" keyDesc="" value="WHSG" valDesc="" /><attribute key="a_flight_end" keyDesc="Flight End" value="N/A" valDesc="" /><attribute key="a_flight_start" keyDesc="Flight Start" value="N/A" valDesc="" /><attribute key="a_isci_description" keyDesc="Isci Description" value="More for Less HSI" valDesc="" /><attribute key="l_user_description" keyDesc="User Description" value="na6.10_1" valDesc="" /><attribute key="l_vwcampaigngroup" keyDesc="Campaign Group" value="CST" valDesc="" /><attribute key="l_vwisciformat" keyDesc="Isci Format" value="CST" valDesc="" /><attribute key="l_VwDeliveryType" keyDesc="Delivery Type" value="1" valDesc="" /><attribute key="a_db_date" keyDesc="" value="06/24/09." valDesc="" /><attribute key="l_phone" keyDesc="" value="Predefined" valDesc="" /><attribute key="l_Price" keyDesc="" value="Predefined" valDesc="" /><attribute key="s_000_Service" keyDesc="Internet Service" value="D3" valDesc="" /><attribute key="s_01_competitor" keyDesc="Select Competitor" value="04_ATTUverse" valDesc="AT&T U-verse" /><attribute key="s_03_price_offer" keyDesc="Select Price" value="01" valDesc="$8.99/mo. " /><attribute key="s_04_term_offer" keyDesc="Select # of Months" value="1" valDesc="for 3 mos." /><attribute key="s_05_phone" keyDesc="Select Phone" value="phone_1" valDesc="1.800.COMCAST" /><attribute key="s_05A_tier" keyDesc="Select Product Tier" value="01_Performance" valDesc="Performance" /><attribute key="s_06_CT_market" keyDesc="Connecticut Market:" value="no" valDesc="No" /><attribute key="s_Media_Table" keyDesc="Dynamic Media Table" value="Yes" valDesc="" />
36 0 m4l_HSI_006$1 0 0 <attribute key="t_weight" keyDesc="Weight" value="0" valDesc="" /><attribute key="t_rid" keyDesc="" value="907" valDesc="" /><attribute key="t_ridver" keyDesc="" value="1" valDesc="" /><attribute key="t_zid" keyDesc="" value="ET_Atlanta" valDesc="" /><attribute key="t_cid" keyDesc="" value="WPBA" valDesc="" /><attribute key="a_flight_end" keyDesc="Flight End" value="N/A" valDesc="" /><attribute key="a_flight_start" keyDesc="Flight Start" value="N/A" valDesc="" /><attribute key="a_isci_description" keyDesc="Isci Description" value="More for Less HSI" valDesc="" /><attribute key="l_user_description" keyDesc="User Description" value="na6.10_1" valDesc="" /><attribute key="l_vwcampaigngroup" keyDesc="Campaign Group" value="CST" valDesc="" /><attribute key="l_vwisciformat" keyDesc="Isci Format" value="CST" valDesc="" /><attribute key="l_VwDeliveryType" keyDesc="Delivery Type" value="1" valDesc="" /><attribute key="a_db_date" keyDesc="" value="06/24/09." valDesc="" /><attribute key="l_phone" keyDesc="" value="Predefined" valDesc="" /><attribute key="l_Price" keyDesc="" value="Predefined" valDesc="" /><attribute key="s_000_Service" keyDesc="Internet Service" value="D3" valDesc="" /><attribute key="s_01_competitor" keyDesc="Select Competitor" value="04_ATTUverse" valDesc="AT&T U-verse" /><attribute key="s_03_price_offer" keyDesc="Select Price" value="01" valDesc="$8.99/mo. " /><attribute key="s_04_term_offer" keyDesc="Select # of Months" value="1" valDesc="for 3 mos." /><attribute key="s_05_phone" keyDesc="Select Phone" value="phone_1" valDesc="1.800.COMCAST" /><attribute key="s_05A_tier" keyDesc="Select Product Tier" value="01_Performance" valDesc="Performance" /><attribute key="s_06_CT_market" keyDesc="Connecticut Market:" value="no" valDesc="No" /><attribute key="s_Media_Table" keyDesc="Dynamic Media Table" value="Yes" valDesc="" />
*/
It looks like the xml variable @versionsxml you used did cause the problem.
You might get even faster results if you'd use a temp table with an indexed xml column...
I hope you can verify and confirm the speed improvement I see...
December 3, 2009 at 3:31 pm
it works perfectly, I need to insert the data into a var. Becasue im creating a function
Thank you for all your advices π
December 4, 2009 at 1:32 am
MTY-1082557 (12/3/2009)
it works perfectly, I need to insert the data into a var. Becasue im creating a functionThank you for all your advices π
First: Glad to hear that Ryans solution works for you π
Second: What is the purpose of te function you're using? Will it be used within a join? If so, I strongly recommend against it, especially if you're talking about large data volume. One of the disadvantages of a table varialbe is the fact that query analyzer will treat it as a one-row-table.
May result in serious performance drop!
If you need an advice on how to reach your goal on a different way you should provide a few more details what the function is supposed to do.
December 4, 2009 at 3:05 am
Here's some stuff to play around with, should you wish...
--structure
create table dbo.Myversionbatchlog (id int, versionsxml xml)
--/
--data
insert dbo.Myversionbatchlog
select 11, '<xml><version rowid="1" alias="hello world" />
<version rowid="2" packid="17" />
<version rowid="5" alias="another alias" packid="17" />
<version rowid="6" alias="yet another alias" /></xml>'
union all select 12, '<xml><version rowid="1" alias="hello world2" />
<version rowid="2" packid="18" />
<version rowid="5" alias="another alias2" packid="18" />
<version rowid="6" alias="yet another alias2" /></xml>'
go
--/
--objects
create function dbo.tf_Myversionbatchlog_ItemFetch(@id int) returns table as
return
SELECT
v.item.value('@rowid','int') rowid,
v.item.value('@versionidentity', 'int') versionidentity,
v.item.value('@alias','varchar(50)') alias,
v.item.value('@packid','int') packid,
v.item.value('@versionid','int') versionid,
v.item.query('./attribute') attr
FROM (select versionsxml from dbo.Myversionbatchlog where id = @id) AS P
CROSS APPLY versionsxml.nodes('xml/version') v(item)
go
create view dbo.vw_Myversionbatchlog as
SELECT
id,
v.item.value('@rowid','int') rowid,
v.item.value('@versionidentity', 'int') versionidentity,
v.item.value('@alias','varchar(50)') alias,
v.item.value('@packid','int') packid,
v.item.value('@versionid','int') versionid,
v.item.query('./attribute') attr
FROM dbo.Myversionbatchlog AS P
CROSS APPLY versionsxml.nodes('xml/version') v(item)
go
--/
--outputs
select * from dbo.tf_Myversionbatchlog_ItemFetch(11)
select * from dbo.tf_Myversionbatchlog_ItemFetch(12)
select * from dbo.vw_Myversionbatchlog where id = 11
select * from dbo.vw_Myversionbatchlog where id = 12
--/
--tidy up
drop table Myversionbatchlog
drop function tf_Myversionbatchlog_ItemFetch
drop view vw_Myversionbatchlog
go
--/
Ryan Randall
Solutions are easy. Understanding the problem, now, that's the hard part.
December 4, 2009 at 9:21 am
Thank you Ryan for your advices.
Lu, I agree about the var tables. We starting to create a process and see what is the best performance way.
thanks again
Viewing 14 posts - 1 through 13 (of 13 total)
You must be logged in to reply to this topic. Login to reply